在这个小数据框中:
d1 = pd.read_csv('to_count.mcve.txt', sep='\t')
M1 M2 F1
A,B,A,C,D A,C,B,C,B A
A,B,B,C,B A,B,A B
C,B,C,D,E B,C E
步骤01:
我想计算 F1中有多少值在M1和M2中
我能做到:
d1_count = d1.apply(lambda x: x.loc[::].str.count(x.F1), 1)
输出:
M1 M2 F1
2 1 1
3 1 1
1 0 1
步骤02:但如果原始单元格的长度超过3(不包括逗号),我想将计数除以2.
说明:
M1中的所有值都长度大于3,第一个M2的长度大于3.因此,需要更改这些值的计数(除以2)。
M1中的第一个值是A,B,A,C,D
A
,M1中有2个'A',使用.str.count(x.F1)
A,B,A,C,D
的长度超过3.我现在更改计数(除以2),结果为1. 最终预期产出为:
M1 M2
1 0.5
1.5 1
0.5 0
任何建议。
答案 0 :(得分:1)
看起来M1
列中的“单元格”是以逗号分隔的字符串。首先将它转换为列表而不是字符串可能更容易,因此您的操作是有意义的。像这样:
df['M1_list'] = df['M1'].apply(lambda x: x.split(","))
现在您有一个名为M1_list
的列,其中每个条目都有一个列表。现在,您可以再次使用.apply()
来获取所需的数字。
df['F1_count'] = df.apply(lambda x: x['M1_list'].count(x['F1']), axis=1)
但是这只会计算F1
中M1_list
项的数量。要获得“如果你有超过3个项目将计数除以2”的条件,你可以做另一个.apply
:
df['F1_count'] = df.apply(lambda x: x['F1_count'] / 2 if len(x['M1']) >= 3 else x['F1_count'], axis=1)
如果您愿意,您当然可以将这些组合成一个.apply
语句。但是,如果拆分复杂的操作,它会使代码更容易阅读。您可以将这种方法与辅助功能结合使用,而不是使用lambda
:
def compute_F1(row):
M1_list = row['M1'].split(",")
f1_count = M1_list.count(row['F1'])
if (len(M1_list) >= 3):
return f1_count / 2
else:
return f1_count
然后将该函数应用于每一行:
df['F1_count'] = df.apply(lambda x: compute_F1(x), axis=1)
你应该得到你的结果。