簡體   English   中英

Python - 按列上的多個條件分組

[英]Python - Group by with multiple conditions on columns

我有以下示例數據框:

data = {'ref':['1', '2', '3', '4', '5'],
        'checked':[True, True, True, False, True],
        'rag':['r', 'r', 'g', 'a', 'r'],
        'group':['high', 'low', 'high', 'medium', 'high']}

dataframe = pd.DataFrame(data)

在此處輸入圖像描述

我想group並在滿足某些條件的情況下進行一些條件計數,因此我得到以下信息:

在此處輸入圖像描述

ngroup並按以下方式進行操作:

df = dataframe.groupby(['group']).agg(
         n=('ref', 'count')
        ).reset_index()

但我也在努力計算每個組的次數:

  • 檢查=真
  • 抹布 = g
  • 抹布=一個
  • 抹布 = r

任何幫助將非常感激!


編輯:將 True/False 字符串更改為 Boolean

你有一些挑戰。

例如,您的 True/False 是字符串,因此您應該將它們初始化為布爾值並在聚合期間使用sum或轉換為布爾值。

要計算破布,使用pandas.crosstab並加入它更容易,同時您仍然將組作為索引。

df = (dataframe
      .groupby(['group'])
      .agg(**{'n': ('ref', 'count'),
              'checked=True': ('checked', lambda s: s.eq('True').sum()),
           })
      .join(pd.crosstab(dataframe['group'], dataframe['rag'])
              .add_prefix('rag=')
           )
      .reset_index()
     )

輸出:

    group  n  checked=True  rag=a  rag=g  rag=r
0    high  3             3      0      1      2
1     low  1             1      0      0      1
2  medium  1             0      1      0      0

您可以在已checkedrag列上分別嘗試pivot_table

n = df.groupby(['group']).agg(n=('ref', 'count'))

dfs = []
for column in ['checked', 'rag']:
    df_ = (df.pivot_table(index='group', columns=[column], values='ref',
                          aggfunc='count', fill_value=0)
          .rename(columns=lambda col: f'{column}={col}')
          .rename_axis(None, axis=1))
    dfs.append(df_)
df = pd.concat(dfs, axis=1).drop('checked=False', axis=1)
print(n.join(df))

        n  checked=True  rag=a  rag=g  rag=r
group
high    3             3      0      1      2
low     1             1      0      0      1
medium  1             0      1      0      0

您的數據示例存在問題:

data = {'ref':['1', '2', '3', '4', '5'],
        'checked':[True, True, True, False, True],
        'rag':['r', 'r', 'g', 'a', 'r'],
        'group':['high', 'low', 'high', 'medium', 'high']}

df = pd.DataFrame(data)

對於checked的列,您應該在不帶引號的情況下將值輸入為True/False 否則,python 會將True'/'Fasle'string

這里的想法是兩個步驟:(1)您將iterationgroupby一起使用。 (2) 然后將它們merge / concat到 1 個表中:

# Create empty table
table = pd.DataFrame()

# List of column you want to iterate:
col_iter = ['checked', 'rag']

# Iterate:
for col in col_iter:
    # Obtain unique values in each col used
    uni = df[col].unique()
    
    # Iterate for each unique value in col.
    # Set tem var
    # Concat tem to table
    for val in uni:
        tem = df.groupby('group').apply(lambda g: (g[col]==val).sum())
        table = pd.concat([table, tem], axis=1).rename(columns={0:f'{col}={val}'})
        

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM