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

2024-04-24 23:00:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我在元组之间有一个字典来列出值,例如:

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

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

    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)

Tags: 数据keydataindexvalueframecountryloc
1条回答
网友
1楼 · 发布于 2024-04-24 23:00:47

您可以创建元组列表并通过^{}^{}检查成员身份:

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

相关问题 更多 >