我在数据框中有很多列,我想将每列中的值与特定列进行比较。例如,假设我希望对于此数据框中的每一列,将列值和标签都等于1的情况求和:
col1 | col2 | col3 | ... | label
1 | 0 | 0 | ... | 1
0 | 0 | 1 | ... | 0
当我尝试使用df.apply(lambda x: x.label==1, axis=1)
之类的内容时,我可以使用x.label
选择标签列,但如何选择列本身呢?
我可以使用遍历列名称的for循环来做到这一点,但我想知道是否有更多类似熊猫的方法而不使用循环。
results = []
for col in df.columns:
val = len(df[(df[col]==1) & (df.label==1)])
results.append(val)
答案 0 :(得分:1)
只需按标签过滤并总结剩下的内容:
df.loc[df['label'] == 1].sum()
示例:
df = pd.DataFrame(np.random.randint(2, size=(10, 4)),
columns=['col1', 'col2', 'col3', 'label'])
print(df)
col1 col2 col3 label
0 0 0 1 1
1 1 1 0 0
2 1 1 0 0
3 0 0 0 0
4 0 0 1 0
5 0 0 0 1
6 1 0 1 1
7 0 1 1 0
8 0 0 0 0
9 0 0 0 0
results = []
for col in df.columns:
val = len(df[(df[col]==1) & (df.label==1)])
results.append(val)
results
[1, 0, 2, 3]
df.loc[df['label'] == 1].sum().tolist()
[1, 0, 2, 3]
修改强>
如果不是一切都是0或1,但你仍然想要将列值和标签都等于1的情况相加,经过标签过滤后,将每个非0或1都归零为0并求和左:
df = pd.DataFrame(np.random.randint(3, size=(10, 4)),
columns=['col1', 'col2', 'col3', 'label'])
print(df)
col1 col2 col3 label
0 0 0 2 1
1 1 0 0 2
2 2 1 0 2
3 1 1 1 0
4 0 0 2 1
5 2 2 1 2
6 0 2 1 1
7 1 1 0 0
8 1 0 0 2
9 0 2 1 2
results = []
for col in df.columns:
val = len(df[(df[col]==1) & (df.label==1)])
results.append(val)
results
[0, 0, 1, 3]
df.loc[df['label'] == 1][df == 1].sum().fillna(0).tolist()
[0.0, 0.0, 1.0, 3.0]
答案 1 :(得分:1)
您可以使用np.equal()
获取boolean
数组以实现元素相等。这适用于任何integer
以及其他dtypes
。
举例说明:
df = pd.DataFrame(np.random.randint(2, size=(10, 4)), columns=['col1', 'col2', 'col3', 'label'])
col1 col2 col3 label
0 0 1 1 0
1 1 0 1 0
2 1 0 0 1
3 1 0 0 0
4 0 1 1 1
5 1 1 0 0
6 0 0 0 1
7 1 1 1 0
8 0 1 0 1
9 0 1 1 1
将label
column
彼此比较column
:
comparison = np.equal(df[['col1', 'col2', 'col3']], df[['label']])
col1 col2 col3
0 True False False
1 False True False
2 True False False
3 False True True
4 False True True
5 False False True
6 False False False
7 False False False
8 False True False
9 False True True
然后,您可以对结果求和,以获得每列的相等案例数:
comparison.sum()
col1 2
col2 5
col3 4
dtype: int64