gpt4 book ai didi

python - Pandas:根据多列值删除或更改特定行

转载 作者:行者123 更新时间:2023-12-01 00:55:24 24 4
gpt4 key购买 nike

我有一个介于元组和值列表之间的字典,例如:

{
('book1', 'US'): [1, 5],
('book2', 'CA'): [3]
}

元组表示 pandas DataFrame 中的列值(也可能还有其他列),列表表示同一数据帧中单个列中的值。
假设我的数据框看起来像这样:

    book country  value
0 book1 US 1
1 book1 US 9
2 book1 US 5
3 book2 MX 7
4 book2 CA 3
5 book1 CA 1

我想删除上面 dict 代表的行,或者将这些行的值更改为 0。
所以结果将是:

    book country  value
0 book1 US 0
1 book1 US 9
2 book1 US 0
3 book2 MX 7
4 book2 CA 0
5 book1 CA 1

或者:

    book country  value
0 book1 US 9
1 book2 MX 7
2 book1 CA 1

执行此操作的最佳方法是什么?
我想在一个相当大的数据帧上执行此操作,并且它应该尽可能高效。

我的想法是做这样的事情,但它似乎不是很有效(由于多个loc)并且我得到重复的行而不是删除行。 (我不想使用 drop_duplicates 因为第一个位置可能有重复项,我不想删除)

data_frame.set_index(['book', 'country'], inplace=True)
for key, values in rows_to_remove.iteritems():
data_frame.loc[key] = data_frame.loc[key][~data_frame.loc[key]['value'].isin(values)]
data_frame.reset_index(inplace=True)

最佳答案

您可以创建元组列表并通过 Index.isin 检查成员资格与 boolean indexing :

d = {
('book1', 'US'): [1, 5],
('book2', 'CA'): [3]
}

tups = [k + (x, ) for k, v in d.items() for x in v]

df = df[~df.set_index(['book','country','value']).index.isin(tups)]
print (df)
book country value
1 book1 US 9
3 book2 MX 7
5 book1 CA 1

对于按条件设置0,请使用loc:

df.loc[df.set_index(['book','country','value']).index.isin(tups), 'value'] = 0
print (df)
book country value
0 book1 US 0
1 book1 US 9
2 book1 US 0
3 book2 MX 7
4 book2 CA 0
5 book1 CA 1

另一个解决方案:

tups = [k + (x, ) for k, v in d.items() for x in v]

df1 = pd.DataFrame(tups, columns=['book','country','value'])

df2 = pd.concat([df, df1, df1], ignore_index=True)
df = df2[~df2.duplicated(keep=False)]
print (df)
book country value
1 book1 US 9
3 book2 MX 7
5 book1 CA 1

关于python - Pandas:根据多列值删除或更改特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56274491/

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