[英]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.