我几次遇到这个问题。问题是我无法理解如何遍历DataFrame中的熊猫系列以访问各个值。
在这种特殊情况下,我试图在pandas 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
以最大行数替换原始文件。有关如何执行此操作的任何建议?
谢谢。
答案 0 :(得分:1)
对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
答案 1 :(得分:1)
您的数据混乱。建议您首先尝试确保将一致的数据(最好是通过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对象的一系列点。然后,其中一些对象就是列表,列表本身就是一系列指针。因此,您有一个嵌套的指针列表,而不是存储在连续内存块中的数字数组。