我有一个像这样的Excel文件:
.----.-------------.-------------------------.-----------------.
| | ID | Shareholder - Last name | DM Cognome |
:----+-------------+-------------------------+-----------------:
| 1. | 01287560153 | MASSIRONI | Bocapine Ardaya |
:----+-------------+-------------------------+-----------------:
| | | CAGNACCI | |
:----+-------------+-------------------------+-----------------:
| 2. | 05562881002 | | Directors |
:----+-------------+-------------------------+-----------------:
| 3. | 04113870655 | SABATO | Sabato |
:----+-------------+-------------------------+-----------------:
| | | VILLARI | |
:----+-------------+-------------------------+-----------------:
| 4. | 01419190846 | SALMERI | Salmeri |
:----+-------------+-------------------------+-----------------:
| | | MICALIZZI | Lipari |
:----+-------------+-------------------------+-----------------:
| | | LIPARI | |
'----'-------------'-------------------------'-----------------'
ffill
由于存在子行,因此我使用pandas和ID列打开了此文件。然后groupby
通过ID获取Shareholder - Last name
和DM\nCognome
列上任何相等值的计数。但是我不能。在这种情况下,结果应为0 row1 0 row2 1 row3 2 row4
。
应该注意的是,第4行由3个子行组成,第3行也由2个子行组成。
我有两个问题:
这是我所做的,但是不起作用:
data['ID'] = data['ID'].fillna(method='ffill')
data.groupby('ID', sort=False, as_index=False)['Shareholder - Last name', 'DM\nCognome'].apply(lambda x: (x['Shareholder - Last name']==x['DM\nCognome']).count())
首先,读取表作为输入(将ID保留为字符串而不是float):
df = pd.read_excel("Workbook1.xlsx", converters={'ID':str})
df = df.drop("Unnamed: 0", axis=1) #drop this column since it is not useful
填写ID,如果缺少股东,请用“ Missing”替换Nan:
df['ID'] = df['ID'].fillna(method='ffill')
df["Shareholder - Last name"] = df["Shareholder - Last name"].fillna("missing")
将姓转换为小写:
df["Shareholder - Last name"] = df["Shareholder - Last name"].str.lower()
自定义函数,用于计算另一列中出现的住户数量:
def f(group):
s = pd.Series(group["DM\nCognome"].str.lower())
count = 0
for surname in group["Shareholder - Last name"]:
count += s.str.count(surname).sum()
return count
最后获得每个ID的计数:
df.groupby("ID",sort=False)[["Shareholder - Last name", "DM\nCognome"]].apply(lambda x: f(x))
输出:
ID
01287560153 0.0
05562881002 0.0
04113870655 1.0
01419190846 2.0
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句