我有一张像下面这样的表格
日期 | 训练 | 条件 1 | 条件2 |
---|---|---|---|
第一天 | 1111 | 真实 | 0 |
第2天 | 2222 | 假 | 2 |
.....
我想将火车与日期分组,
日期 | 列车总数 | 条件 1 的训练为真 | 训练条件 2 > 0 | 训练条件1为真,条件2>0 |
---|---|---|---|---|
第一天 | 1 | 1 | 0 | 0 |
第2天 | 1 | 0 | 1 | 0 |
我怎样才能用 Pandas 做到这一点?
答案 0 :(得分:1)
尝试通过 groupby()
和 agg()
方法:
out=(df.groupby('date',as_index=False)
.agg(
{'train':'count','condition 1':lambda x:x,'condition 2':lambda x:x.gt(0)}
)
)
最后使用astype()
方法:
out[['condition 1','condition 2']]=out[['condition 1','condition 2']].astype(int)
out
的输出:
date train condition 1 condition 2
0 day1 1 1 0
1 day2 1 0 1
如果需要更改列的名称,请使用:
out.columns=['date','train total count','train with condition 1 is true','train with condition 2']
答案 1 :(得分:1)
Print (df)
date train condition 1 condition 2
0 day1 1111 True 0
1 day2 2222 False 2
df['condition 1']=df['condition 1'].astype(int)
让我们试试 groupby agg
df.groupby('date').agg(traintotalcount=('train', 'count'), trainwithcondition1istrue=('condition 1', lambda x: x.astype(int)), trainwithcondition2gt0=('condition 2', lambda x: int(x>0)))
结果
traintotalcount trainwithcondition1istrue trainwithcondition2gt0
date
day1 1 1 0
day2 1 0 1
答案 2 :(得分:1)
您可以使用 .agg() 方法对不同的列应用不同的聚合。
试试这个:
df.groupby('date').agg({'train':'count',
'condition 1':'sum',
'condition 2': lambda x: (x>0).sum()})
输出:
train condition 1 condition 2
date
day1 1 1 0
day2 1 0 1
请注意,如果 condition 1
是布尔列,python 在求和时会将 True
视为 1
,将 False
视为 0
。
答案 3 :(得分:1)
为了提高性能,comapre greater
像 0
之前的 groupby 到 helper 列,然后将 count
与 sum
聚合以计算 {{3} 中的 True
s 值}},对于带有空格的新列名,使用 **
解包技巧:
df1 = (df.assign(new = df['condition 2'].gt(0))
.groupby('date')
.agg(**{'train total count': ('train', 'count'),
'train with condition 1 is true': ('condition 1','sum'),
'train with condition 2 > 0':('new','sum')})
.reset_index())
print (df1)
date train total count train with condition 1 is true \
0 day1 1 1
1 day2 1 0
train with condition 2 > 0
0 0
1 1