我在过滤数据时遇到问题。我坚持了一些观点,无法解决。我正在使用熊猫。
假设我有两个以上的列表。这次我们可以说我在做三个列表。它们是:“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 个就可以了。
我正在尝试这样做,但无论如何都可以使用熊猫功能来做到这一点?我做不到。如果你有帮助,那就没问题了。谢谢你。
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] 删除。
我来说两句