Python Pandas-根据条件的层次结构选择行
我有一个数据框,我想根据数据框的某些列中嵌套的值层次结构获取“第一个可用”索引 例如:Python Pandas-根据条件的层次结构选择行,python,pandas,Python,Pandas,我有一个数据框,我想根据数据框的某些列中嵌套的值层次结构获取“第一个可用”索引 例如: import pandas as pd foo = ['a','a','a','a','b','b','b','b'] bar = [0,0,1,1,2,2,1,1] foobar = ['x',1,1,2,2,3,4,5] df = pd.DataFrame({'foo':foo,'bar':bar,'foobar':foobar}) 这给了你: foo bar foobar 0 a
import pandas as pd
foo = ['a','a','a','a','b','b','b','b']
bar = [0,0,1,1,2,2,1,1]
foobar = ['x',1,1,2,2,3,4,5]
df = pd.DataFrame({'foo':foo,'bar':bar,'foobar':foobar})
这给了你:
foo bar foobar
0 a 0 x
1 a 0 1
2 a 1 1
3 a 1 2
4 b 2 2
5 b 2 3
6 b 1 4
7 b 1 5
规则如下:对于foo
中的每个值,根据bar
和foobar
中的值选择一个且仅一个行索引。对于bar
,这是条件的层次结构:0>1>2>。
对于foobar
它是'x>1>2>。
<代码> FoBOAR 应嵌套在
0
和6
。IIUC,您可以使用+:
输出
Int64Index([0, 4], dtype='int64')
其思想是按层次优先级对数据帧的行进行排序,将“x”替换为0(或任何其他高优先级)。然后查找foo列复制的行
更新
对于新案例,您可以执行以下操作:
df = df.set_index('foo').sort_index().sort_values(by=['bar', 'foobar'],
key=lambda x: x.replace('x', 0).astype(int)).reset_index()
mask = df.duplicated(subset=['foo'])
res = df[~mask].index
print(res)
IIUC,您可以使用+:
输出
Int64Index([0, 4], dtype='int64')
其思想是按层次优先级对数据帧的行进行排序,将“x”替换为0(或任何其他高优先级)。然后查找foo列复制的行
更新
对于新案例,您可以执行以下操作:
df = df.set_index('foo').sort_index().sort_values(by=['bar', 'foobar'],
key=lambda x: x.replace('x', 0).astype(int)).reset_index()
mask = df.duplicated(subset=['foo'])
res = df[~mask].index
print(res)
我得到
TypeError:sort_values()在使用code@JohannesWiesner您使用的熊猫版本是什么?我的熊猫版本是“1.0.5”。关键参数是在1.1.0中添加的。对不起,我必须更新我的问题并更改foo
中的值。我刚刚发现,只有当foo
只包含整数时,您的方法才有效。在我的真实数据框中,foo
包含参与者ID,这些ID是唯一的字符串(例如,'sub\u a123'
)。当我使用code@JohannesWiesner您使用的熊猫版本是什么?我的熊猫版本是'1.0.5'。关键参数是在1.1.0中添加的。对不起,我必须更新我的问题并更改foo
中的值。我刚刚发现,只有当foo
只包含整数时,您的方法才有效。在我的真实数据框中,foo
包含参与者ID,这些ID是唯一的字符串(例如,'sub_a123'
)。是什么决定了层次结构?这应该由用户决定。用户决定的内容将如何到达,处于什么状态?这只是df
中bar
和foobar
的顺序吗?是的。数据框中的列可能不止是bar
和foobar
。也就是说,用户应该能够确定层次结构的层次结构。人们可以粗略地把它想象成bar>foobar
。此外,bar
的值有一个0>1>2>的层次结构,foobar
的值有一个1>2>的层次结构。也许一种方法是将感兴趣的列转换成分类变量。然后可以为bar
的所有值和foobar
的所有值建立一个用户定义的因子水平层次结构?它是否总是foo
组中的第一个?您的预期输出为0和4。你能展示一个不是第一个的情况吗?是什么决定了层次结构?这应该由用户决定。用户决定的内容将如何到达,处于什么状态?这只是df
中bar
和foobar
的顺序吗?是的。数据框中的列可能不止是bar
和foobar
。也就是说,用户应该能够确定层次结构的层次结构。人们可以粗略地把它想象成bar>foobar
。此外,bar
的值有一个0>1>2>的层次结构,foobar
的值有一个1>2>的层次结构。也许一种方法是将感兴趣的列转换成分类变量。然后可以为bar
的所有值和foobar
的所有值建立一个用户定义的因子水平层次结构?它是否总是foo
组中的第一个?您的预期输出为0和4。你能举个不是第一个的例子吗?