gpt4 book ai didi

python - 如何将函数的多个返回值定位到 pandas 数据框的多列中?

转载 作者:太空宇宙 更新时间:2023-11-04 01:47:08 25 4
gpt4 key购买 nike

我有一个计算最大频率项及其比率的函数,我想将这些值设置在数据框中两个不同列的 NaN_values:(注意:每列还有其他值(非_NaN值),我要填na)

  Id    numbers     max_frq    rate
1 1,1,1,2,3 NaN NaN
2 1,6,6,6 NaN NaN
3 7,7 NaN NaN

预期:

  id    numbers     max_frq    rate
1 1,1,1,2,3 1 0.6
2 1,6,6,6 6 0.75
3 7,7 7 1.0

这是我的代码,它用重复值(max_no 的第一个值,rate 的第一个值)填充列中的所有 NaN 值。如何通过关联值填充每个 Id 行

def max_rate(Id) # Id is a list 
num = pd.Series(numbers).value_counts()
max_no = num.max()
sum_no = num.sum()
rate = max_no / sum_no
return max_no, rate_no

for Id in (df["Id"].unique()):
max_no, rate_no = max_rate(Id)
df.max_frq = df.max_frq.fillna(max_no)
df.rate = df.rate.fillna(rate_no)

我还检查了this similar question但我不明白如何使用 lambdaseries 以及放置 (fillna) 条件的位置,我编写了这个

for Id in (df["Id"].unique()):
g = lambda x: pd.Series(max_rate(x))
df[['max_frq', 'rate']] = df.apply(g, axis=1)

并得到错误:('具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()', '发生在索引 50')

最佳答案

要解决您需要的每一行的问题:

  • 在数字列表中找到最常见的值
  • 找出所有事件的哪一部分是最常见的
  • 将结果存储在两个新列中

请看下面的代码。

from collections import Counter


def max_rate(values):
most_common, num_most_common = Counter(values).most_common(1)[0]
return most_common, num_most_common / len(values)

df = pd.DataFrame({'numbers': [[1, 1, 1, 2, 3],
[1, 6, 6, 6],
[7, 7]]})

df[['most_common', 'rate']] = pd.DataFrame(df['numbers'].apply(max_rate).tolist())
print(df)

结果:

           numbers  most_common  rate
0 [1, 1, 1, 2, 3] 1 0.60
1 [1, 6, 6, 6] 6 0.75
2 [7, 7] 7 1.00

如果你不想使用Counter你可以像下面这样实现max_rate函数

def max_rate(values):
most_common_value = max(values, key=values.count)
return most_common_value, values.count(most_common_value) / len(values)

编辑:如果您想使用已经包含 NaN 值的列显式创建数据框,您可以这样做:

import pandas as pd
import numpy as np

df = pd.DataFrame({'numbers': [[1, 1, 1, 2, 3], [1, 6, 6, 6], [7, 7]]})
df['most_common'] = np.nan
df['rate'] = np.nan

result = df['numbers'].apply(max_rate)
for i, (most_common, rate) in zip(df.index, result):
df.at[i, 'most_common'] = most_common
df.at[i, 'rate'] = rate

在该解决方案中,您可以遍历数据名并使用收到的结果逐行更新它。不过,我更喜欢以前的方式,您只需根据获得的结果创建新列。

编辑2:

如果你一定要使用fillna,你可以尝试如下,但是,在我看来,它仍然是绕过第一个解决方案。

df = pd.DataFrame({'numbers': [[1, 1, 1, 2, 3], [1, 6, 6, 6], [7, 7]]})
df['most_common'] = np.nan
df['rate'] = np.nan

result = df['numbers'].apply(max_rate)

df = df.fillna({'most_common': pd.Series([elem[0] for elem in result]),
'rate': pd.Series([elem[1] for elem in result])})

关于python - 如何将函数的多个返回值定位到 pandas 数据框的多列中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58856127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com