如何根据列表有条件地更新 Pandas 中的 DataFrame 列
Posted
技术标签:
【中文标题】如何根据列表有条件地更新 Pandas 中的 DataFrame 列【英文标题】:How to conditionally update DataFrame column in Pandas based on list 【发布时间】:2016-10-24 21:56:45 【问题描述】:假设我有一个包含一列的数据框:
df = pd.DataFrame(np.random.randint(0,9,size=(100, 1)), columns=['number'])
我有两个列表,一个包含偶数,另一个包含奇数。
odd_numbers = [1,3,5,7,9]
even_numbers = [0,2,4,6,8]
我想根据 df['number'] 中的值在数据框上创建另一个系列,显示“偶数”或“奇数”
类似:
df['odd_or_even'] = 'even' if df[number].isin(even_numbers)
df['odd_or_even'] = 'odd' if df[number].isin(odd_numbers)
【问题讨论】:
重要的是列表是条件检查。 【参考方案1】:map 版本:
首先,创建一个字典:
d = **o: "odd" for o in odd_numbers, **e: "even" for e in even_numbers
然后在系列上使用地图:
df['odd_or_even'] = df['number'].map(d)
【讨论】:
【参考方案2】:我觉得你可以用numpy.where
:
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0,9,size=(100, 1)), columns=['number'])
df['odd_or_even'] = np.where(df.number % 2, 'odd', 'even')
print (df)
number odd_or_even
0 1 odd
1 0 even
2 4 even
3 5 odd
4 0 even
5 0 even
6 1 odd
7 0 even
8 7 odd
9 8 even
通过评论编辑
使用loc
:
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0,9,size=(20, 1)), columns=['number'])
odd_numbers = [1,3,5,7,9]
even_numbers = [0,2,4,6,8]
df.loc[df.number.isin(odd_numbers), 'odd_or_even'] = 'odd'
df.loc[df.number.isin(even_numbers), 'odd_or_even'] = 'even'
print (df)
number odd_or_even
0 5 odd
1 1 odd
2 2 even
3 3 odd
4 5 odd
5 6 even
6 3 odd
7 4 even
8 2 even
9 8 even
10 8 even
11 1 odd
12 2 even
13 1 odd
14 3 odd
15 3 odd
16 5 odd
17 4 even
18 2 even
19 5 odd
【讨论】:
我已经为这个例子简化了我的数据框。我实际上并没有检查奇数或偶数。我需要对照列表检查现有系列的元素。以上是关于如何根据列表有条件地更新 Pandas 中的 DataFrame 列的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 python 或 pandas 根据包含字典列表的列过滤 DataFrame?
如何根据条件行值对 pandas 数据框进行取消堆叠或取消透视?