使用行方式比较迭代pandas列

时间:2016-02-01 08:10:48

标签: python numpy pandas

我在数据框中有很多列,我想将每列中的值与特定列进行比较。例如,假设我希望对于此数据框中的每一列,将列值和标签都等于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)

2 个答案:

答案 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