![](/img/trans.png)
[英]Count unique values in multiple columns according by group (pandas dataframe)
[英]Count occurance of unique values in a pandas dataframe across multiple columns
我在熊貓中有以下數據幀
df = pd.DataFrame({'a' : ['hello', 'world', 'great', 'hello'], 'b' : ['world', None, 'hello', 'world'], 'c' : [None, 'hello', 'great', None]})
我想計算所有其他列和列'a'中列'a'中唯一值的出現,並將其保存到數據幀的新列中,並使用適當的命名來獲取列'a'中的值如'hello_count','world_count'等。 因此,最終結果將是這樣的
df = pd.DataFrame({'a' : ['hello', 'world', 'great', 'hello'], 'b' : ['world', None, 'hello', 'world'], 'c' : [None, 'hello', 'great', None], 'hello_count' : [1,1,1,1], 'world_count' : [1,1,0,1], 'great_count' : [0,0,2,0]})
我試過了
df['a', 'b', 'a'].groupby('a').agg(['count])
但那沒用。 任何幫助都非常感謝
讓我們使用pd.get_dummies
和groupby
:
(df1.assign(**pd.get_dummies(df1)
.pipe(lambda x: x.groupby(x.columns.str[2:], axis=1)
.sum())))
輸出:
a b c great hello world
0 hello world None 0 1 1
1 world None hello 0 1 1
2 great hello great 2 1 0
3 hello world None 0 1 1
以下是步驟中的上述解決方案。
df_gd = pd.get_dummies(df1)
print(df_gd)
a_great a_hello a_world b_hello b_world c_great c_hello
0 0 1 0 0 1 0 0
1 0 0 1 0 0 0 1
2 1 0 0 1 0 1 0
3 0 1 0 0 1 0 0
df_gb = df_gd.groupby(df_gd.columns.str[2:], axis=1).sum()
print(df_gb)
great hello world
0 0 1 1
1 0 1 1
2 2 1 0
3 0 1 1
df_out = df1.join(df_gb)
print(df_out)
輸出繼電器:
a b c great hello world
0 hello world None 0 1 1
1 world None hello 0 1 1
2 great hello great 2 1 0
3 hello world None 0 1 1
在循環中使用df.apply
簡化作業。 然后測試每行中有多少元素與所需字符串相同:
for ss in df.a.unique():
df[ss+"_count"] = df.apply(lambda row: sum(map(lambda x: x==ss, row)), axis=1)
print(df)
輸出:
a b c hello_count world_count great_count
0 hello world None 1 1 0
1 world None hello 1 1 0
2 great hello great 1 0 2
3 hello world None 1 1 0
您可以創建字典d_unique = {}並將所有唯一值作為密鑰對分配給它,考慮名為data_rnr的數據幀:
d_unique={}
for col in data_rnr.columns:
print(data_rnr[col].name)
print(len(data_rnr[col].unique()))
d_unique[data_rnr[col].name]=len(data_rnr[col].unique())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.