根据两列的值选择熊猫数据框行
Posted
技术标签:
【中文标题】根据两列的值选择熊猫数据框行【英文标题】:Select pandas frame rows based on two columns' values 【发布时间】:2015-08-15 10:28:40 【问题描述】:我希望根据两列值选择一些特定的行。例如:
d = 'user' : [1., 2., 3., 4] ,'item' : [5., 6., 7., 8.],'f1' : [9., 16., 17., 18.], 'f2':[4,5,6,5], 'f3':[4,5,5,8]
df = pd.DataFrame(d)
print df
Out:
f1 f2 f3 item user
0 9 4 4 5 1
1 16 5 5 6 2
2 17 6 5 7 3
3 18 5 8 8 4
我想根据“用户”和“项目”的值选择行。给定一个存储 [user, item] 值对的 2d numpy 数组:
samples = np.array([[1,5],[3,7],[3,7],[2,6]])
Out:
array([[1, 5],
[3, 7],
[3, 7],
[2, 6]])
那么预期的输出是:
Out:
f1 f2 f3 item user
0 9 4 4 5 1
2 17 6 5 7 3
2 17 6 5 7 3
1 16 5 5 6 2
然后,我的最终目标是获得一个 2d numpy 数组来存储除 item 和 user 之外的所有列值,即:
Out:
array([[9, 4, 4],
[17, 6, 5],
[17, 6, 5],
[16, 5, 5]])
我们可以看到,它是 f1、f2、f3 列的值。
我该怎么做?
【问题讨论】:
【参考方案1】:如果您将samples
设为具有user
和item
列的DataFrame,那么您可以使用inner join 获得所需的值。默认情况下,pd.merge
合并到共享共享的samples
和df
的所有列上——在这种情况下,这将是user
和item
。因此,
result = pd.merge(samples, df, how='inner')
产量
user item f1 f2 f3
0 1 5 9 4 4
1 3 7 17 6 5
2 3 7 17 6 5
3 2 6 16 5 5
import numpy as np
import pandas as pd
d = 'user' : [1., 2., 3., 4] ,'item' : [5., 6., 7., 8.],'f1' : [9., 16., 17., 18.], 'f2':[4,5,6,5], 'f3':[4,5,5,8]
df = pd.DataFrame(d)
samples = np.array([[1,5],[3,7],[3,7],[2,6]])
samples = pd.DataFrame(samples, columns=['user', 'item'])
result = pd.merge(samples, df, how='inner')
result = result[['f1', 'f2', 'f3']]
result = result.values
print(result)
产量
[[ 9. 4. 4.]
[ 17. 6. 5.]
[ 17. 6. 5.]
[ 16. 5. 5.]]
【讨论】:
哇! @unutbu,太好了!谢谢!这就是我想要的,因为我不想使用 for 循环。【参考方案2】:一种有点numpy
数组的方法倾斜 -
import numpy as np
# Convert item and user columns to a 2-column array
item_user_arr = np.asarray(df[["item","user"]]).astype(int)
# Mask of matches across rows of samples and item_user_arr, with columns flipped
mask = (samples[:,None,1]==item_user_arr[:,0]) & (samples[:,None,0]==item_user_arr[:,1])
# Get indices of matches
_,C = np.where(mask)
# Use those indices to select data from f1,f2,f3 columns for final output array
out = np.asarray(df[["f1","f2","f3"]])[C,:]
给定输入的输出 -
In [536]: out
Out[536]:
array([[ 9., 4., 4.],
[ 17., 6., 5.],
[ 17., 6., 5.],
[ 16., 5., 5.]])
【讨论】:
感谢@Divakar,这也是处理这个问题的好方法!以上是关于根据两列的值选择熊猫数据框行的主要内容,如果未能解决你的问题,请参考以下文章