[英]Group and Compare multiple dataframe columns with conditions in 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
並在滿足某些條件的情況下進行一些條件計數,因此我得到以下信息:
我n
按group
並按以下方式進行操作:
df = dataframe.groupby(['group']).agg(
n=('ref', 'count')
).reset_index()
但我也在努力計算每個組的次數:
任何幫助將非常感激!
編輯:將 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
您可以在已checked
和rag
列上分別嘗試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)您將iteration
與groupby
一起使用。 (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.