我在pandas中有以下数据框
df = pd.DataFrame({'a' : ['hello', 'world', 'great', 'hello'], 'b' : ['world', None, 'hello', 'world'], 'c' : [None, 'hello', 'great', None]})
我想计算所有其他列和列'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])
但这不起作用。任何帮助都非常感谢
答案 0 :(得分:3)
让我们使用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
答案 1 :(得分:0)
在循环中使用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
答案 2 :(得分: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())