使用 Pandas 过滤基于列的特定信息

melike8

我在过滤数据时遇到问题。我坚持了一些观点,无法解决。我正在使用熊猫。

假设我有两个以上的列表。这次我们可以说我在做三个列表。它们是:“A1”、“A2”和“A3”。

A1=[x,m,d] A2=[dd,cc,aa,bb,tt], A3=[kk,yy,ll,ss]

例如我的数据是这样的:

X
一种 x,m,d
一种 d C
一种 x,m,d,dd,cc
一种 x,m,dd
一种 yy,ll,dd,cc,aa j

在这里,我想在这个列表中提取整列,如果有其他属于不同列表的字符应该在新行中。就像数据框中的最后一行。输出应该是这样的:

X
一种 x,m,d
一种 x,m,d
一种 x, 米
一种 是的,我 j
一种 dd,cc,aa j

第一个数据帧中的第二个原始数据消失了,因为只有一个字符。我想要列表中所有字符的 50% 以上。并且第一个数据帧中的最后一行被分成两部分(它们也遵守 50% 规则)。

*百分之五十规则:例如,对于列表 A1,它们是 3,如果有 2 个或两个以上对我来说是可以的,或者对于 A2 列表,有 2 个或超过 2 个就可以了。

我正在尝试这样做,但无论如何都可以使用熊猫功能来做到这一点?我做不到。如果你有帮助,那就没问题了。谢谢你。

not_speshal
解释:
  1. 创建仅包含列“y”中的“特殊”和“其他”字符的列。
  2. 仅保留特殊列长度大于 1 的行。
  3. 堆叠“特殊”和“其他列”以获得新列“y”
代码:
df["special"] = df["y"].apply(lambda x: [char for char in x.split(", ") if char in special])
df["other"] = df["y"].apply(lambda x: [char for char in x.split(", ") if char not in special])

output = df[df["special"].apply(len)>1]
output = output.drop("y", axis=1).set_index(["x", "z"]).stack().rename("y").reset_index().drop("level_2", axis=1)
output = output[output["y"].apply(len)>0][["x","y","z"]]
output["y"] = output["y"].apply(", ".join) #convert list back to string
输出:
>>> output
   x        y  z
0  a  x, m, d  b
2  a  x, m, d  t
3  a     g, i  t
4  a     x, m  k
5  a        i  k
输入:
df = pd.DataFrame({"x": ["a", "a", "a", "a"],
                   "y": ["x, m, d", "d", "x, m, d, g, i", "x, m, i"],
                   "z": ["b", "c", "t", "k"]
                   })
special = ["x", "m", "d"]

>>> df
   x              y  z
0  a        x, m, d  b
1  a              d  c
2  a  x, m, d, g, i  t
3  a        x, m, i  k

编辑

为多个列表合并 50% 规则(在问题发生重大变化后)

代码:
df["A1"] = df["y"].apply(lambda x: [char for char in x.split(", ") if char in A1])
df["A2"] = df["y"].apply(lambda x: [char for char in x.split(", ") if char in A2])
df["A3"] = df["y"].apply(lambda x: [char for char in x.split(", ") if char in A3])

output = df.drop("y", axis=1).set_index(["x", "z"]).stack().rename("y")
output = output[output.apply(lambda x: (all(c in A1 for c in x) and len(x)>=0.5*len(A1)) or
                                        (all(c in A2 for c in x) and len(x)>=0.5*len(A2)) or
                                        (all(c in A3 for c in x) and len(x)>=0.5*len(A3)))]
output.droplevel(2).reset_index()[["x", "y", "z"]]
输出:
>>> output
   x             y  z
0  a     [x, m, d]  b
1  a     [x, m, d]  t
2  a        [x, m]  k
3  a  [dd, cc, aa]  j
4  a      [yy, ll]  j
输入:
df = pd.DataFrame({"x": ["a", "a", "a", "a", "a"],
                   "y": ["x, m, d", "d", "x, m, d, dd, cc", "x, m, dd", "yy, ll, dd, cc, aa"],
                   "z": ["b", "c", "t", "k", "j"]
                   })

A1 = ["x", "m", "d"]
A2 = ["dd", "cc", "aa", "bb", "tt"]
A3 = ["kk", "yy", "ll", "ss"]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Pandas删除基于特定列的重复值?

使用Pandas过滤掉特定列中的值

使用特定键通过字典列过滤pandas DataFrame

使用 Pandas 在 python 中使用特定列获取数据帧中的过滤结果

Pandas groupby 使用基于两列的聚合

使用python pandas基于表的多列旋转特定类型数据的理想方法是什么?

如何基于特定列中的值有条件地使用`pandas.DataFrame.apply`?

使用基于for循环的pandas中的多个特定条件来计算多个列

如何使用pandas group by进行基于逻辑的过滤

基于第二列的Pandas DataFrame过滤

使用 Pandas 过滤列中的行并使用 DataFrame 中的 sum()

使用Pandas在Excel中的特定列操作

如何使用 Pandas 在特定列中写入

使用来自特定列的信息将函数应用于 Pandas 数据帧的每个单元格

如何从pandas列中提取特定信息?

使用特定的索引和过滤从 Pandas df 获取值

使用 Pandas 遍历列

使用OR语句过滤Pandas Dataframe

如何使用 Pandas 过滤值?

通过pandas过滤特定列的数据

Pandas DataFrame过滤基于其他列的str列

使用pandas聚合基于其他列的结果

使用 SQL Server 基于列过滤记录

Pandas Dataframe:根据使用列定义的条件进行过滤

使用 python pandas 过滤/迭代列中的每个项目

如何在 Pandas 中使用 notnull() 过滤多级列?

使用行键和列键过滤 pandas 文档

使用 value_counts 和多列过滤 Pandas DataFrame?

pandas:使用unix时间戳中的列过滤数据