我有一个看起来像这样的数据框:
A
1 [67.0, 51.0, 23.0, 49.0, 3.0]
2 0
3 [595.0]
4 0
5 [446.0, 564.0, 402.0]
6 0
7 0
我想找到每个列表的均值,而忽略零。我想得到类似的东西:
A Mean
1 [67.0, 51.0, 23.0, 49.0, 3.0] 38.6
2 0 0
3 [595.0] 595.0
4 0 0
5 [446.0, 564.0, 402.0] 470.7
6 0 0
7 0 0
我尝试了此处列出的许多可能的解决方案,但没有一个起作用。这是我到目前为止尝试过的:
df['Mean'] = df.A.apply(lambda x: mean(x))
这给我这个错误
TypeError:“ int”对象不可迭代
也是
df['Mean'] = df['A'].mean(axis=1)
ValueError:对象类型没有轴命名为
也尝试过这些,没有运气:
a = np.array( df['A'].tolist())
a.mean(axis=1)
mean(d for d in a if d)
还有其他可以尝试的方法可以给我带来预期的结果吗?感谢您的帮助。
答案 0 :(得分:1)
一种方法是使用列表推导并计算mean
,其中给定行是列表,可以使用isinstance
进行检查。这是必要的,否则您将得到:
TypeError:“ int”对象不可迭代
该函数期望可迭代。因此,您可以这样做:
from statistics import mean
df['mean'] = [mean(i) if isinstance(i, list) else i for i in df.A]
A mean
0 [67.0, 51.0, 23.0, 49.0, 3.0] 38.600000
1 0 0.000000
2 [595.0] 595.000000
3 0 0.000000
4 [446.0, 564.0, 402.0] 470.666667
5 0 0.000000
6 0 0.000000
或者您也可以使用np.mean
来处理ints
和可迭代项:
import numpy as np
df['mean'] = df.A.map(np.mean)
A mean
0 [67.0, 51.0, 23.0, 49.0, 3.0] 38.600000
1 0 0.000000
2 [595.0] 595.000000
3 0 0.000000
4 [446.0, 564.0, 402.0] 470.666667
5 0 0.000000
6 0 0.000000
答案 1 :(得分:1)
好的,这对我有用
A
1 [67.0, 51.0, 23.0, 49.0, 3.0]
2 0
3 [595.0]
4 0
5 [446.0, 564.0, 402.0]
6 0
7 0
使用np.mean
data['A'].apply(lambda x: np.mean(eval(x)))
输出
A Mean
1 [67.0, 51.0, 23.0, 49.0, 3.0] 38.600000
2 0 0.000000
3 [595.0] 595.000000
4 0 0.000000
5 [446.0, 564.0, 402.0] 470.666667
6 0 0.000000
7 0 0.000000
答案 2 :(得分:0)
from collections.abc import Iterable
import numpy as np
def calculate_mean(x):
if isinstance(x["A"], Iterable):
x["mean"] = np.mean(x["A"])
else:
x["mean"] = x["A"]
return x
df = df.apply(lambda x: calculate_mean(x), axis=1)
编辑-
df["mean"] = df.apply(lambda x: np.mean(x["A"]), axis=1)