我遇到这个问题好几次了。问题是,我无法理解如何在DataFrame中迭代熊猫系列来访问单个值。
在这种情况下,我试图为熊猫DataFrame中的特定列中的每一行找到最大值,其中一些行包含列表。
df是这样的:
Date Number
0 2000-01-01 [1.0]
1 2000-01-02 [2.2, 5, 7.8]
2 2000-01-03 [8.2]
3 2000-01-04 [4, 11.78, 24.66]与这一问题有关的尝试代码如下:
Find the max of two or more columns with pandas
但是,我试图替换当前的列,由于某种原因,它似乎为我的列提供了一个空列表。
预期产出如下:
Date Number
0 2000-01-01 1.0
1 2000-01-02 7.8
2 2000-01-03 8.2
3 2000-01-04 24.66取行的最大值并替换原行。对于如何做到这一点,有什么建议吗?
提前谢谢。
发布于 2019-01-21 15:02:28
将列表理解与if-else结合使用
import ast
df.Number = df.Number.apply(ast.literal_eval)
df.Number = [max(i, default=0) if isinstance(i, list) else i for i in df.Number]与apply的替代
df.Number = df.Number.apply(lambda i: max(i, default=0) if isinstance(i, list) else i)print (df)
Date Number
0 2000-01-01 1
1 2000-01-02 7
2 2000-01-03 8
3 2000-01-04 24发布于 2019-01-21 15:27:19
你的数据很乱。我建议您首先尝试确保将一致的数据输入您的数据,最好是通过float系列。如果做不到这一点,您可以使用嵌套的try / except来覆盖杂乱数据所涵盖的任意数量的场景:
df = pd.DataFrame({'Dat': ['2000-01-01', '2000-01-02', '2000-01-03', '2000-01-04',
'2000-01-05', '2000-01-06', '2000-01-07'],
'Number': ['1', ['2.2', '5.0', '7.8'], '8', ['4', '11.78', '24.66'],
np.nan, None, []]})
def calc_max(x):
try:
return float(x)
except TypeError:
try:
return max(map(float, x), default=np.nan)
except TypeError:
return np.nan
# apply function to each value in 'Number'
df['Number'] = list(map(calc_max, df['Number']))
print(df)
Dat Number
0 2000-01-01 1.00
1 2000-01-02 7.80
2 2000-01-03 8.00
3 2000-01-04 24.66
4 2000-01-05 NaN
5 2000-01-06 NaN
6 2000-01-07 NaN为什么你的数据是混乱的
检查df['Number'].dtype。如果您的数据是干净的/熊猫友好的,您将看到int或float。但在这里你可以看到object。这表示了指向任意Python对象的一系列点。然后这些对象中的一些是列表,而列表本身就是一系列指针。因此,您有一个指针的嵌套列表,而不是存储在连续内存块中的数字数组。
https://stackoverflow.com/questions/54292610
复制相似问题