Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pandas-根据条件的层次结构选择行_Python_Pandas - Fatal编程技术网

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 应嵌套在Bar 中,因此如果有多个可用值用于<代码> BAR <代码> >只考虑“代码”> Bar <代码>中的“第一个可用”值,然后根据 FoBar 中的值层次结构获得一行索引,用于特定值的“代码> Bar < /C> > /< 预期产出:

例如,应该选择索引
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。你能举个不是第一个的例子吗?