Python Dataframe-统计列表元素的出现次数
我有以下数据帧: 新列包含列表中从0到5的数字(每个数字和交易的金额可能不同)。我想计算每个事务中每个数字的出现次数,并将该数字保存在另一个数据框中,如下所示: 我刚刚为Cat_0创建了一个lambda函数来测试它,不幸的是,它无法工作,因为它正在创建“None”条目(参见图2) 这就是功能:Python Dataframe-统计列表元素的出现次数,python,pandas,dataframe,counter,Python,Pandas,Dataframe,Counter,我有以下数据帧: 新列包含列表中从0到5的数字(每个数字和交易的金额可能不同)。我想计算每个事务中每个数字的出现次数,并将该数字保存在另一个数据框中,如下所示: 我刚刚为Cat_0创建了一个lambda函数来测试它,不幸的是,它无法工作,因为它正在创建“None”条目(参见图2) 这就是功能: df_cat["Cat_0"] = df_train["basket_new"].map(lambda x: df_cat["Cat_0"]+
df_cat["Cat_0"] = df_train["basket_new"].map(lambda x: df_cat["Cat_0"]+1 if "0" in x else None)
您能告诉我我做错了什么/如何解决我的问题吗?使用以下方法:
使用数据的前5行:
for i in range(0,5): df_cat["Cat_{0}".format(i)] = df['basket'].map(lambda x: x.count(i))
Cat_0 Cat_1 Cat_2 Cat_3 Cat_4 Cat_5
0 0 0 0 1 0 0
1 1 0 0 2 0 1
2 0 1 0 1 1 1
3 0 0 1 0 0 0
4 0 0 0 0 4 0
使用
分解
和交叉表
。
假设您有这样一个df:
df = pd.DataFrame({'a':[1,2,3,4], 'b':[[1,2],[0],[3,1,2,3],[4,2,2,2,1]]})
df:
a b
0 1 [1, 2]
1 2 [0]
2 3 [3, 1, 2, 3]
3 4 [4, 2, 2, 2, 1]
如果要重命名列,请执行以下操作:
df[['a', 'b']].join(pd.crosstab(df1.index, df1, colnames=['b']).add_prefix('cat_'))
这是一个相当长的一个,但它的工作
df.explode('basket_new').groupby(['transaction_id','customerType','basket_new']).agg(count = ('basket_new','count'))\
.reset_index().pivot_table(index=['transaction_id','customerType'], columns='basket_new', values='count', fill_value=0)\
.reset_index()
这可能是一个比我“更好”的答案。更多的熊猫是索尼克人。我还可以想象,对于大型数据集,速度要快得多。
a b 0 1 2 3 4
0 1 [1, 2] 0 1 1 0 0
1 2 [0] 1 0 0 0 0
2 3 [3, 1, 2, 3] 0 1 1 2 0
3 4 [4, 2, 2, 2, 1] 0 1 3 0 1
df[['a', 'b']].join(pd.crosstab(df1.index, df1, colnames=['b']).add_prefix('cat_'))
a b cat_0 cat_1 cat_2 cat_3 cat_4
0 1 [1, 2] 0 1 1 0 0
1 2 [0] 1 0 0 0 0
2 3 [3, 1, 2, 3] 0 1 1 2 0
3 4 [4, 2, 2, 2, 1] 0 1 3 0 1
df.explode('basket_new').groupby(['transaction_id','customerType','basket_new']).agg(count = ('basket_new','count'))\
.reset_index().pivot_table(index=['transaction_id','customerType'], columns='basket_new', values='count', fill_value=0)\
.reset_index()