将 Counter 对象转换为 Pandas DataFrame
Transform a Counter object into a Pandas DataFrame
我在列表中使用 Counter
来计算这个变量:
final = Counter(event_container)
打印最后给出:
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})
现在我想将 final
转换为 Pandas DataFrame
,但是当我这样做时:
final_df = pd.DataFrame(final)
但是我得到一个错误。
我想 final 不是一个合适的字典,那么我怎样才能将 final
转换成一个字典呢?还是将 final
转换为 DataFrame
的另一种方法?
如果您想要两列,请在使用 from_dict
:
从字典创建 DataFrame
时设置关键字参数 orient='index'
final_df = pd.DataFrame.from_dict(final, orient='index')
您可以使用 from_dict
and pass param orient='index'
, then call 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
您可以将列重命名为更有意义的名称:
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
我发现将 Counter 转换为 pandas Series 更有用,该 Series 已经按计数排序并且排序的项目是索引,所以我使用了 zip
:
def counter_to_series(counter):
if not counter:
return pd.Series()
counter_as_tuples = counter.most_common(len(counter))
items, counts = zip(*counter_as_tuples)
return pd.Series(counts, index=items)
计数器对象的 most_common
方法 returns (item, count)
元组的列表。 zip
计数器没有物品时会抛出异常,所以必须事先检查一个空的计数器。
另一种选择是使用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'])
是单线的,速度好像一样
或使用此变体按最常用的方式对它们进行排序。同样,性能大致相同。
df = pd.DataFrame.from_records(c.most_common(), columns=['page','count'])
您得到的错误可能是“如果使用所有标量值,您必须传递一个索引。”
要解决此问题,只需提供一个索引(例如“计数”),然后转置:
final_df = pd.DataFrame(final, index=['count']).transpose()
完成。
如果需要,您可以在之后重命名索引。
我在列表中使用 Counter
来计算这个变量:
final = Counter(event_container)
打印最后给出:
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})
现在我想将 final
转换为 Pandas DataFrame
,但是当我这样做时:
final_df = pd.DataFrame(final)
但是我得到一个错误。
我想 final 不是一个合适的字典,那么我怎样才能将 final
转换成一个字典呢?还是将 final
转换为 DataFrame
的另一种方法?
如果您想要两列,请在使用 from_dict
:
DataFrame
时设置关键字参数 orient='index'
final_df = pd.DataFrame.from_dict(final, orient='index')
您可以使用 from_dict
and pass param orient='index'
, then call 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
您可以将列重命名为更有意义的名称:
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
我发现将 Counter 转换为 pandas Series 更有用,该 Series 已经按计数排序并且排序的项目是索引,所以我使用了 zip
:
def counter_to_series(counter):
if not counter:
return pd.Series()
counter_as_tuples = counter.most_common(len(counter))
items, counts = zip(*counter_as_tuples)
return pd.Series(counts, index=items)
计数器对象的 most_common
方法 returns (item, count)
元组的列表。 zip
计数器没有物品时会抛出异常,所以必须事先检查一个空的计数器。
另一种选择是使用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'])
是单线的,速度好像一样
或使用此变体按最常用的方式对它们进行排序。同样,性能大致相同。
df = pd.DataFrame.from_records(c.most_common(), columns=['page','count'])
您得到的错误可能是“如果使用所有标量值,您必须传递一个索引。” 要解决此问题,只需提供一个索引(例如“计数”),然后转置:
final_df = pd.DataFrame(final, index=['count']).transpose()
完成。 如果需要,您可以在之后重命名索引。