Python:在对数据帧

时间:2018-04-15 13:15:46

标签: python pandas dataframe pandas-groupby

我的数据框如下所示:

┌────┬──────┬──────┐
│ No │ col1 │ col2 │
├────┼──────┼──────┤
│  1 │ A    │  5.0 │
│  1 │ B1   │ 10.0 │
│  1 │ B2   │ 20.0 │
│  2 │ A    │  0.0 │
│  2 │ B1   │  0.0 │
│  2 │ C1   │  0.0 │
│  3 │ A    │  0.0 │
│  3 │ B1   │  5.0 │
│  3 │ C1   │ 20.0 │
│  3 │ C2   │ 30.0 │
└────┴──────┴──────┘

首先,我使用groupby按数据列

对数据框进行分组

我现在想做三件事:

  1. 从该列的所有行中的col2 == 0.0列中获取值列表(在本例中为No.2)
  2. 获取col2 != 0.0 col1 == 'A'的{​​{1}}列表,但该组的至少另一行有col2 == 0.0(在这种情况下为3号)
  3. 获取最少1行包含col2 == 0.0(No.2和3)的No的列表
  4. 很抱歉一次提出三个问题。希望没关系。

    谢谢:)

1 个答案:

答案 0 :(得分:1)

您可以使用:

g = df['col2'].eq(0).groupby(df['No'])
a = g.all()
a = a.index[a].tolist()
print (a)
[2]

b1 = (df['col2'].ne(0) & df['col1'].eq('A')).groupby(df['No']).any()
b2 = (df['col2'].eq(0) & df['col1'].ne('A')).groupby(df['No']).any()
b = b1 & b2
b = b.index[b].tolist()
print (b)
[]

c = g.any()
c = c.index[c].tolist()
print (c)
[2,3]

另一个解决方案应该是返回布尔值DataFrame的自定义函数和带有3个列表的最终创建字典:

def f(x):
    a = x['col2'].eq(0)
    b1 = x['col2'].ne(0) & x['col1'].eq('A')
    b2 = a & x['col1'].ne('A')
    b = b1.any() & b2.any()

    return pd.Series([a.all(), b, a.any()], index=list('abc'))

m = df.groupby('No').apply(f)
print (m)
        a      b      c
No                     
1   False  False  False
2    True  False   True
3   False  False   True

fin = {x: m[x].index[m[x]].tolist() for x in m.columns}
print (fin)
{'a': [2], 'b': [], 'c': [2, 3]}