【问题标题】:How to count values for columns in a groupby dataframe?如何计算分组数据框中列的值?
【发布时间】:2020-11-20 23:12:24
【问题描述】:

所以我遇到了这个问题:

我试过了,但它会堆积时间:

df2 = df.groupby(['Time'])
for group, data in df2:
    result =  data.apply(lambda x: x.value_counts()).T.stack()
    print(result)

【问题讨论】:

  • 很好,但我有 100 列;我怎样才能在循环中实现它......现在,我有这个工作(忽略“时间”的第一个结果):
    df = pd.DataFrame({ 'Time': ['T0', 'T0', 'T1', 'T1'], 'Health': ['Yes', 'Yes', 'No', 'No'], 'Meds': ['Good', 'Bad', 'Good', 'Good'] }) for key, value in df.iteritems(): result = df.groupby(['Time', key]).size().unstack(0).fillna(0) print(result)

标签: python pandas dataframe group-by


【解决方案1】:

您正在尝试将Time 的值用作新列,并将其他列的值用作新索引。如果您只有几列,则可以通过pivot_table 轻松实现。例如。对于'Health'

In [2]: df = pd.DataFrame([['T0', 'Yes', 'Good'], ['T0', 'Yes', 'Bad'], ['T1', 'No', 'Good'], ['T1', 'No', 'Good']], columns=['Time', 'Health', 'Meds'])    

In [18]: pd.pivot_table(df[['Health', 'Time']], index='Health', columns='Time', aggfunc='size', fill_value=0)                                                                                                      
Out[18]: 
Time    T0  T1
Health        
No       0   2
Yes      2   0

但是,您希望对所有列重复该过程。假设您将数据框重塑为长数据格式,这也可以通过数据透视表实现。这意味着您创建一个包含所有列名的新列,这正是 stack() 函数的用途:

In [45]: df_stacked = df.set_index('Time').stack().rename('value').reset_index()                                                                                                                                                
Out[45]: 
  Time level_1 value
0   T0  Health   Yes
1   T0    Meds  Good
2   T0  Health   Yes
3   T0    Meds   Bad
4   T1  Health    No
5   T1    Meds  Good
6   T1  Health    No
7   T1    Meds  Good

现在您可以旋转堆叠的数据框,以便同时使用所有列名的列的值及其作为索引的值

In [48]: pd.pivot_table(df_stacked, index=['level_1', 'value'], columns='Time', aggfunc='size', fill_value=0)                                                                                                      
Out[48]: 
Time           T0  T1
level_1 value        
Health  No      0   2
        Yes     2   0
Meds    Bad     1   0
        Good    1   2

描述可能有点混乱,但我希望代码能清楚地说明。你基本上有正确的成分,但组合有点棘手。

【讨论】:

  • 美丽。我想在不使用 for 循环的情况下做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-31
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 2021-06-07
相关资源
最近更新 更多