繁体   English   中英

python pandas:如何检查列项是否也是列表项

[英]python pandas: How to check if a column item is also item of a list

如果现有 dataframe 列符合我的条件,我会尝试更改它们的特定值。 以下代码可以正常工作,我确信可以以更准确的方式完成,但优化现在不是问题。

我的 dataframe:

df = pd.DataFrame({"list1": [0, 1, 2, 3, 4, 5],  
                   "list2": [1, 2, 3, 4, 5, 6]})

到目前为止我的代码:

def function(var, x, y):
   print("DF before:", var, sep="\n", end="\n\n")
   cond = [var["list1"] == x, var["list1"] == y]
   choice = [True, True]
   var["test"] = np.select(cond, choice)
   var["copy"] = np.where(var["test"], var["list1"], 0)
   var["changed"] = var.apply(lambda row: row["copy"] + (x*y) if row["copy"] else 0, axis=1)
   var["list1"] = var.apply(lambda row: row["changed"] if row["changed"] != 0 else row["list1"], axis=1)
   print("manipulated DF:", var, sep="\n", end="\n\n")
   var.drop(["test", "copy", "changed"])
   print("clean manipulated DF:", var, sep="\n", end="\n\n")

function(df, x=2, y=5)

在我的原始代码中,我的列表中有一些条目,如果满足,每个条目都应返回“True”。
悲剧开始了:
我尝试将列表添加为新列以开始对其进行比较。 但是由于列表只是从 'list1' 中选择的一种值,它永远不会达到相同的长度。所以列表类似于condition_list = [1, 3, 5]
不幸的是,我还没有找到自动调整长度的方法,例如为缺失值插入 0。 即使,下一个问题是:条目必须在正确的 position 上,所以如果条件列表的项目是 5,我需要将它放在“list1”的第 6 行。
所以我想用上面的代码我可以只扫描“list1”列中的条目,然后只更改那些特定条目的值。 但我无法让这个工作。 它只是更改我的列的第一个值,索引为 0 或我的列的每个条目,或者它什么也不发生,因为所有条目在df["test"]中都设置为 False。

有问题的代码如下所示:

# list of entries have to be found in list1 to change values in list2
entries_to_met = [1, 3, 5]

def function2(var):
   print("DF before:", var, sep="\n", end="\n\n")
   cond = [var["list1"] == entries_to_met.item]
   choice = [True]
   var["test"] = np.select(cond, choice)
   var["copy"] = np.where(var["test"], var["list2"], 0)
   var["changed"] = var.apply(lambda row: row["copy"] + 15 if row["copy"] else 0, axis=1)
   var["list2"] = var.apply(lambda row: row["changed"] if row["changed"] != 0 else row["list2"], axis=1)
   print("manipulated DF:", var, sep="\n", end="\n\n")
   var.drop(["test", "copy", "changed"])
   print("clean manipulated DF:", var, sep="\n", end="\n\n")

function2(df)

我希望有人有一个想法。 如果对该问题有任何不清楚的地方:请随时提问。

编辑

因为它似乎需要一个更好的问题描述:我的输入看起来像:

列表1 清单2
0 0 1
1 1 2
2 2 3
3 3 4
4 4 5
5 5 6

而我想要的 output,在entries_to_met = [1, 3, 5]的条目与 list1 的条目匹配后,应该如下所示:

列表1 清单2
0 0 1
1 1 17
2 2 3
3 3 19
4 4 5
5 5 21

你想要这个吗?

mask = (df['list1'].isin([1,3,5]))
df.loc[ mask, 'list2'] = df.loc[mask]['list2'] + 15

通过 numpy:

import numpy as np
mask = (df['list1'].isin([1,3,5]))
df['list2'] = np.where(mask, df['list2']+15, df['list2'])
import pandas as pd

df = pd.DataFrame({"list1": [0, 1, 2, 3, 4, 5],
                   "list2": [1, 2, 3, 4, 5, 6]})

ltm = [1, 3, 5]

df.loc[df['list1'].isin(ltm), 'list2'] += 15
    
df
列表1 清单2
0 0 1
1 1 17
2 2 3
3 3 19
4 4 5
5 5 21

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM