我有一个 pandas 数据框,其中的值有时会变为 NA。我想用与另一列长度相同的字符串列表填充此列:
import pandas as pd
import numpy as np
df = pd.DataFrame({"a": ["one", "two"],
"b": ["three", "four"],
"c": [[1, 2], [3, 4]],
"d": [[5, 6], np.nan]})
一个 | b | 丙 | d |
---|---|---|---|
一 | 三 | [1, 2] | [5, 6] |
二 | 四 | [3, 4] | 钠 |
我希望这成为
一个 | b | 丙 | d |
---|---|---|---|
一 | 三 | [1, 2] | [5, 6] |
二 | 四 | [3, 4] | [无值,无值] |
我试过
df["d"] = np.where(df.d.isna(),
['no_value' for element in df.c],
df.d)
和
df["d"] = np.where(df.d.isna(),
['no_value'] * len(df.c),
df.d)
但两者都不起作用。有人有主意吗?
解决方案:我稍微调整了 PaulS 的回答:
df[‘d‘] = np.where(df.d.isna(),
pd.Series([['no_value'] * len(lst) for lst in df.c]),
df.d))
一个可能的解决方案是使用
np.where
。另一种可能的解决方案是使用:
apply
,使用 lambda 函数迭代每一行df
,检查列中的值是否d
为NaN
。如果满足条件,该函数将生成一个新列表,其中填充重复的字符串
'no_value'
以匹配列中列表的长度c
。如果
x['d']
不满足这些条件,x['d']
则保留原来的值。输出:
要使用,
where
我们必须构建一个正确的nan
包含数组,一个类似于的数组df.d
,带有对象数据类型列表。要获得完全控制,请从
empty
对象 dtype 数组开始,然后填充它。df.c
如果列表的长度不同,则不需要这两个步骤。现在where
可以使用[False, True]
条件在 2 个对象 dtype 数组的元素之间进行选择。不行,因为它是 (2,2) 形状,并且
where
在用其他项 ((2,) 系列) 进行“广播”时会出现问题。或者你可以初始化
x
为