计算跨多个列的pandas数据帧中唯一值的出现次数

时间:2018-02-02 22:23:26

标签: python pandas dataframe

我在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])

但这不起作用。任何帮助都非常感谢

3 个答案:

答案 0 :(得分:3)

让我们使用pd.get_dummiesgroupby

(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

以上是上述解决方案。

第1步:pd.get_dummies

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

步骤2:groupby列名忽略前两个字母

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

第3步:加入原始数据框

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())