熊猫,按特定顺序获取元素

时间:2018-05-18 11:54:06

标签: python pandas

我有一个pandas数据帧

col1    col2
Apple     70
Lemon     80
Banana    90

我有一个按特定顺序列出col1元素的列表:

my_list = ['Banana', 'Apple', 'Lemon']

我需要按照col2

的顺序获取my_list的值
result = [90, 70, 80]

我怎么能实现这一目标? 感谢

PS:我看到了我的问题的几个解决方案,所以也许我过度简化了它,因为有些解决方案不能有效解决我的实际问题(我过分简化的错误)。

问题稍微复杂一点,我的数据框有更多的列和很多行。

col1    col2   col3
Apple     70   red
Lemon     80   red
Banana    90   red
Lemon     2    blue
Apple     3    blue
Banana    4    blue
Lemon     67   green
Banana    68   green
Apple     69   green

基本上col1的值对col3的每个值重复(但顺序可能不同!)

我需要的是col3的每个值从col2获取值的向量,但总是具有相同的顺序。

所以我通过这样做获得my_list:

my_list = np.unique(df['col2'])

然后我迭代col3的每个元素,获得我发布的简单示例。

这并没有改变答案,但我可能会选择一个或另一个考虑到整个情况。

4 个答案:

答案 0 :(得分:2)

Pandas 0.15介绍了Categorical Series

df = ...
my_list = ['Banana', 'Apple', 'Lemon']

df['col1'] = pd.Categorical(df['col1'], my_list )
df.sort("col1")

result = df['col2']

答案 1 :(得分:2)

您可以创建一个系列并使用map。这应该比使用pd.Categorical或列表推导进行排序更有效。

s = df.set_index('col1')['col2']
res = list(map(s.get, my_list))

print(res)

[90, 70, 80]

答案 2 :(得分:1)

如果uniquecol1

,请使用reindex
a = df.set_index('col1').reindex(my_list)['col2'].values.tolist()
print (a)
[90, 70, 80]

ordered categoricals

from pandas.api.types import CategoricalDtype
cat_type = CategoricalDtype(categories=my_list, ordered=True)

df['col1'] = df['col1'].astype(cat_type)

df = df.sort_values('col2', ascending=False)
print (df['col2'].tolist())
[90, 80, 70]
df['col1'] = pd.Categorical(df['col1'], my_list, ordered=True)

df = df.sort_values('col2', ascending=False)
print (df['col2'].tolist())
[90, 80, 70]

答案 3 :(得分:-2)

let d = document.querySelector('div'), gcs = window.getComputedStyle(d, null); window.addEventListener('resize', () => { let w = gcs.getPropertyValue("width"); d.textContent = "current width: " + w; }); 已经"内置"排序方法,试试这个:

pandas