python - Pandas value_counts() for loop 因 lambda 而失败

标签 python pandas lambda

我有一些包含三个变量的数据框,我想为每个变量创建一个包含每个标签的相对计数的字典。

我很容易地创建了一个 forloop 来输出我想要的,但是我的 lambda 产生了奇怪的结果。

数据如下:

In [3]:

import pandas as pd
raw_data = {
    'category1': ['Red', 'Red', 'Red', 'Green'],
    'category2': ['Plane', 'Plane', 'Plane', 'Car'],
    'category3': ['Orange', 'Orange', 'Orange', 'Banana'],
    }
df = pd.DataFrame(raw_data)
df
Out[3]:
category1   category2   category3
0   Red Plane   Orange
1   Red Plane   Orange
2   Red Plane   Orange
3   Green   Car Banana

这个 for 循环产生了我想要的精确输出:

In [4]:

forloop = {}
for column in df:
    forloop[column] = df[column].value_counts(normalize=True).to_dict()
forloop
Out[4]:
{'category1': {'Green': 0.25, 'Red': 0.75},
 'category2': {'Car': 0.25, 'Plane': 0.75},
 'category3': {'Banana': 0.25, 'Orange': 0.75}}

但是,由于某些未知原因,此 lambda 失败了:

In [6]:

ratio = lambda x: x.value_counts(normalize=True).to_dict()
output_lambda = df.apply(ratio)
output_lambda
Out[6]:
category1    <built-in method values of dict object at 0x10...
category2    <built-in method values of dict object at 0x10...
category3    <built-in method values of dict object at 0x10...
dtype: object

最佳答案

除了没有解压缩 dict 调用之外,我实际上无法理解这里出了什么问题,这是实现您想要的目标的一种迂回方式:

In [86]:
ratio = lambda x: x.value_counts(normalize=True)
output_lambda = df.apply(lambda x: [x.value_counts().to_dict()]).apply(lambda x: x[0]).to_dict()
output_lambda

Out[86]:
{'category1': {'Green': 1, 'Red': 3},
 'category2': {'Car': 1, 'Plane': 3},
 'category3': {'Banana': 1, 'Orange': 3}}

看起来它是将函数对象绑定(bind)为列值而不是将其解包为字典,我在上面所做的是将 value_counts 作为列表返回,然后调用 再次应用 以解压单个元素列表。这会强制在初始 apply 调用中将 dict 解压缩到单个元素列表中:

In [87]:
output_lambda = df.apply(lambda x: [x.value_counts().to_dict()])
output_lambda

Out[87]:
category1        [{'Green': 1, 'Red': 3}]
category2        [{'Plane': 3, 'Car': 1}]
category3    [{'Banana': 1, 'Orange': 3}]
dtype: object

关于python - Pandas value_counts() for loop 因 lambda 而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30606880/

相关文章:

java - 如何利用可选的 lambda 表达式

c# - Linq.Select() 中的嵌套表达式方法调用

Python Turtle 对象不移动

python - 如何绘制从特定开始日期开始的时间序列?

python - 保存和恢复 Pandas 显示选项

python - 创建一个数据透视表,其中我的值是我列的计数

c++ - 闭包捕获的变量存储在哪里?

python - 如何在 pygame 中创建 "while mouse down"循环

python - pandas如何在不创建新列的情况下进行外连接

Python列表类型列表串联、随机模块