将Counter对象转换为Pandas DataFrame

wos*_*tom 35 python counter dataframe pandas

Counter在列表上用来计算这个变量:

final = Counter(event_container)
Run Code Online (Sandbox Code Playgroud)

打印最终给出:

Counter({'fb_view_listing': 76, 'fb_homescreen': 63, 'rt_view_listing': 50, 'rt_home_start_app': 46, 'fb_view_wishlist': 39, 'fb_view_product': 37, 'fb_search': 29, 'rt_view_product': 23, 'fb_view_cart': 22, 'rt_search': 12, 'rt_view_cart': 12, 'add_to_cart': 2, 'create_campaign': 1, 'fb_connect': 1, 'sale': 1, 'guest_sale': 1, 'remove_from_cart': 1, 'rt_transaction_confirmation': 1, 'login': 1})
Run Code Online (Sandbox Code Playgroud)

现在我想转换final成熊猫DataFrame,但是当我做的时候:

final_df = pd.DataFrame(final)
Run Code Online (Sandbox Code Playgroud)

但是我收到了一个错误.

我猜最终不是一个合适的字典,所以如何转换final为字典?或者它是另一种转换finalDataFrame?的方式?

EdC*_*ica 66

你可以构造使用from_dict并传递param orient='index',然后调用,reset_index这样你得到一个2列df:

In [40]:
from collections import Counter
d = Counter({'fb_view_listing': 76, 'fb_homescreen': 63, 'rt_view_listing': 50, 'rt_home_start_app': 46, 'fb_view_wishlist': 39, 'fb_view_product': 37, 'fb_search': 29, 'rt_view_product': 23, 'fb_view_cart': 22, 'rt_search': 12, 'rt_view_cart': 12, 'add_to_cart': 2, 'create_campaign': 1, 'fb_connect': 1, 'sale': 1, 'guest_sale': 1, 'remove_from_cart': 1, 'rt_transaction_confirmation': 1, 'login': 1})
df = pd.DataFrame.from_dict(d, orient='index').reset_index()
df

Out[40]:
                          index   0
0                         login   1
1   rt_transaction_confirmation   1
2                  fb_view_cart  22
3                    fb_connect   1
4               rt_view_product  23
5                     fb_search  29
6                          sale   1
7               fb_view_listing  76
8                   add_to_cart   2
9                  rt_view_cart  12
10                fb_homescreen  63
11              fb_view_product  37
12            rt_home_start_app  46
13             fb_view_wishlist  39
14              create_campaign   1
15                    rt_search  12
16                   guest_sale   1
17             remove_from_cart   1
18              rt_view_listing  50
Run Code Online (Sandbox Code Playgroud)

您可以将列重命名为更有意义的内容:

In [43]:
df = df.rename(columns={'index':'event', 0:'count'})
df

Out[43]:
                          event  count
0                         login      1
1   rt_transaction_confirmation      1
2                  fb_view_cart     22
3                    fb_connect      1
4               rt_view_product     23
5                     fb_search     29
6                          sale      1
7               fb_view_listing     76
8                   add_to_cart      2
9                  rt_view_cart     12
10                fb_homescreen     63
11              fb_view_product     37
12            rt_home_start_app     46
13             fb_view_wishlist     39
14              create_campaign      1
15                    rt_search     12
16                   guest_sale      1
17             remove_from_cart      1
18              rt_view_listing     50
Run Code Online (Sandbox Code Playgroud)


pva*_*sek 7

另一种选择是使用DataFrame.from_records方法

import pandas as pd
from collections import Counter

c = Counter({'fb_view_listing': 76, 'fb_homescreen': 63, 'rt_view_listing': 50, 'rt_home_start_app': 46, 'fb_view_wishlist': 39, 'fb_view_product': 37, 'fb_search': 29, 'rt_view_product': 23, 'fb_view_cart': 22, 'rt_search': 12, 'rt_view_cart': 12, 'add_to_cart': 2, 'create_campaign': 1, 'fb_connect': 1, 'sale': 1, 'guest_sale': 1, 'remove_from_cart': 1, 'rt_transaction_confirmation': 1, 'login': 1})

df = pd.DataFrame.from_records(list(dict(c).items()), columns=['page','count'])

Run Code Online (Sandbox Code Playgroud)

这是一个单线和速度似乎是一样的。

或者使用这个变体让它们按最常用的排序。同样,性能大致相同。

df = pd.DataFrame.from_records(c.most_common(), columns=['page','count'])
Run Code Online (Sandbox Code Playgroud)

  • 我将其提名为最佳答案,因为您之后不需要重命名列,并且它避免了将数据列视为索引而不是索引列(由于 from_dict 中的“orient”参数) (2认同)

gal*_*ath 6

如果您想要两列,请在从字典orient='index'创建时设置关键字参数:DataFramefrom_dict

final_df = pd.DataFrame.from_dict(final, orient='index')
Run Code Online (Sandbox Code Playgroud)

请参阅DataFrame.from_dict 的文档