gpt4 book ai didi

python - 在非空行上过滤数据框

转载 作者:太空宇宙 更新时间:2023-11-04 11:22:23 27 4
gpt4 key购买 nike

我有一个来自这种形式的 DataFrame:

In [122]: df=pd.DataFrame({"A":["1,2,3","4,5,6",np.nan,"8"],"B":[6,7,8,9]})

In [123]: df
Out[123]:
A B
0 1,2,3 6
1 4,5,6 7
2 NaN 8
3 8 9

我想过滤 B 中的行,其中 A 中的列表包含特定值,例如“4”。

我试过使用这种语法:

df["B"][["4" in a for a in df["A"].str.split(',')]]

但我得到 TypeError: argument of type 'float' is not iterable 因为其中一行中的 NaN。所以我尝试了这种语法-

df["B"][["4" in a for a in df["A"].str.split(',') if pd.notnull(a)]]

但是我得到了 ValueError: The truth value of an array with more than one element is ambiguous。使用 a.any() 或 a.all()

知道如何让它发挥作用吗?我尝试了一些想法,但没有一个奏效,而且我真的不知道为什么这种语法是错误的。

预期输出 - 7

最佳答案

使用 pandas 替代品:

s = df.loc[df["A"].str.split(',', expand=True).eq('4').any(axis=1), 'B']
print (s)
1 7
Name: B, dtype: int64

解释:

Series.str.split中通过参数expand=True创建DataFrame :

print (df["A"].str.split(',', expand=True))
0 1 2
0 1 2 3
1 4 5 6
2 NaN NaN NaN
3 8 None None

通过 DataFrame.eq 进行比较(==):

print (df["A"].str.split(',', expand=True).eq('4'))
0 1 2
0 False False False
1 True False False
2 False False False
3 False False False

通过 DataFrame.any 检查每行是否至少有一个 True :

print (df["A"].str.split(',', expand=True).eq('4').any(axis=1))
0 False
1 True
2 False
3 False
dtype: bool

最后按 DataFrame.loc 过滤与 boolean indexing .

您的解决方案应更改为 if-elseisinstance:

mask = ["4" in a if isinstance(a, list) else False for a in df["A"].str.split(',')]

s = df.loc[mask, 'B']

关于python - 在非空行上过滤数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55688633/

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