假设我有以下数据框:
elements = [1,1,1,1,1,2,3,4,5]
df = pd.DataFrame({'elements': elements})
df.set_index(['elements'])
print df
elements
0 1
1 1
2 1
3 1
4 1
5 2
6 3
我有一个 list
[1, 1, 2, 3]
我想要一个包含这 4 个元素的数据框子集,例如: elements
0 1
1 1
5 2
6 3
我已经能够通过构建一个 dict 来计算数组中的项目出现次数并通过附加初始数据框的子部分来构建新数据框来处理它。
你知道一些数据框方法来帮助我找到更优雅的解决方案吗?
在@jezrael 评论之后:我必须补充一点,我需要跟踪初始索引(在 df 中)。
我们可以将 df (第一个数据框)视为资源存储库,我需要跟踪哪些行/索引被归因:
用例是:在 df 中的元素中给我两个 1、一个 2 和一个 3。我会坚持这样一个事实,即我将第 0 行和第 1 行设为 1,将第 4 行设为 2,将第 5 行设为 3。
最佳答案
当且仅当您的 Series
和 list
已排序(否则,请参见下文),然后您可以执行以下操作:
L = [1, 1, 2, 3]
df[df.elements.apply(lambda x: x == L.pop(0) if x in L else False)]
elements
0 1
1 1
5 2
6 3
list.pop(i)
返回并删除 list
中的值在索引 i
.因为两者,elements
和 L
, 被排序,弹出子集列表 i==0
的第一个元素 ( L
)将始终出现在 elements
中相应的第一个元素处.所以在
lambda
的每次迭代中在 elements
, L
会变成:| element | L | Output |
|=========|==============|===========|
| 1 | [1, 1, 2, 3] | True |
| 1 | [1, 2, 3] | True |
| 1 | [2, 3] | False |
| 1 | [2, 3] | False |
| 1 | [2, 3] | False |
| 2 | [2, 3] | True |
| 3 | [3] | True |
| 4 | [] | False |
| 5 | [] | False |
如您所见,您的列表最后是空的,因此如果出现问题,您可以提前复制它。或者,您实际上在刚刚创建的新数据框中拥有该信息!
如
df.elements
未排序,创建一个排序副本,在上面应用相同的 lambda 函数,但它的输出将用作原始数据帧的索引(使用值为 True 的索引):df
elements
0 5
1 4
2 3
3 1
4 2
5 1
6 1
7 1
8 1
cp = df.elements.copy()
cp.sort_values(inplace=True)
tmp = df.loc[cp.apply(lambda x: x == L.pop(0) if x in L else False)]
print tmp
elements
2 3
3 1
4 2
5 1
HTH
关于pandas - 根据值(重复)提取 Pandas 数据帧的子集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38587936/