Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.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 按列比较下拉列表(列表中)元素/数据帧行_Python_Python 3.x_Pandas - Fatal编程技术网

Python 按列比较下拉列表(列表中)元素/数据帧行

Python 按列比较下拉列表(列表中)元素/数据帧行,python,python-3.x,pandas,Python,Python 3.x,Pandas,我正在为一个问题挣扎一段时间。我有一个由其他列表组成的列表,当逐元素打印时如下所示: [120, 2, 'germany'] [122, 1, 'germany'] [123, 1, 'france'] [122, 1, 'germany'] [120, 2, 'germany'] [123, 1, 'france'] 我想删除在最后一个“列”(index(2))中具有相同值的子列表,而只在中间的“列”(index(1))中具有比具有相同最后索引(2)的行具有更低值的子列表。不用担心,我知道到

我正在为一个问题挣扎一段时间。我有一个由其他列表组成的列表,当逐元素打印时如下所示:

[120, 2, 'germany']
[122, 1, 'germany']
[123, 1, 'france']
[122, 1, 'germany']
[120, 2, 'germany']
[123, 1, 'france']

我想删除在最后一个“列”(index(2))中具有相同值的子列表,而只在中间的“列”(index(1))中具有比具有相同最后索引(2)的行具有更低值的子列表。不用担心,我知道到目前为止这是一个列表,没有实际列。因此,输出应该如下所示:

[120, 2, 'germany']
[123, 1, 'france']
[120, 2, 'germany']
[123, 1, 'france']
到目前为止,我已经尝试了多种方法,从单循环到同时循环,再到创建列表副本并再次迭代。过了一段时间,我将列表转换为一个数据帧(尽管我必须将其转换回列表以进行进一步处理),并再次尝试了几种方法,但迄今为止没有成功

我得到的最接近的结果是:

dfList = pd.DataFrame(list, columns =['ID',"status","country"])
dfList = dfList.groupby('country').filter(lambda g: len(g) > 1).drop_duplicates(subset=['country', 'status'], keep="first")
但是,这将仅为我提供数据帧中的每个唯一值。困难在于,代码还需要与其他值一起重用,因此我无法使用实际值进行过滤

我将非常感谢您的一些想法或想法。

尝试使用此代码

data = [[120, 2, 'germany']
    , [122, 1, 'germany']
    , [123, 1, 'france']
    , [122, 1, 'germany']
    , [120, 2, 'germany']
    , [123, 1, 'france']]

d = {}

for i in data:
    if not d.__contains__(i[2]):
        d[i[2]] = i
    elif d[i[2]][1] < i[1]:
        d[i[2]] = i

for i in d.values():
    print(i)
data=[[120,2,'德国']
,[122,1,‘德国’]
,[123,1,‘法国’]
,[122,1,‘德国’]
,[120,2,‘德国’]
,[123,1,'法国']]
d={}
对于数据中的i:
如果不是d.uu包含(i[2]):
d[i[2]]=i
elif d[i[2][1]
尝试使用此代码

data = [[120, 2, 'germany']
    , [122, 1, 'germany']
    , [123, 1, 'france']
    , [122, 1, 'germany']
    , [120, 2, 'germany']
    , [123, 1, 'france']]

d = {}

for i in data:
    if not d.__contains__(i[2]):
        d[i[2]] = i
    elif d[i[2]][1] < i[1]:
        d[i[2]] = i

for i in d.values():
    print(i)
data=[[120,2,'德国']
,[122,1,‘德国’]
,[123,1,‘法国’]
,[122,1,‘德国’]
,[120,2,‘德国’]
,[123,1,'法国']]
d={}
对于数据中的i:
如果不是d.uu包含(i[2]):
d[i[2]]=i
elif d[i[2][1]
如果我正确理解了这个问题,我可以建议将此方法作为代码的基础

rows=[[120, 2, 'germany'],
[122, 1, 'germany'],
[123, 1, 'france'],
[122, 1, 'germany'],
[120, 2, 'germany'],
[123, 1, 'france']]


rd={}
for row in rows:
    if row[2] not in rd:
        rd[row[2]]=row[1]
        print(row)
    elif row[1] >= rd[row[2]]:
        rd[row[2]]=row[1]
        print(row)
输出将是

[120, 2, 'germany']
[123, 1, 'france']
[120, 2, 'germany']
[123, 1, 'france']

正如您所希望的那样

如果我正确理解了这个问题,我可以建议将此方法作为代码的基础

rows=[[120, 2, 'germany'],
[122, 1, 'germany'],
[123, 1, 'france'],
[122, 1, 'germany'],
[120, 2, 'germany'],
[123, 1, 'france']]


rd={}
for row in rows:
    if row[2] not in rd:
        rd[row[2]]=row[1]
        print(row)
    elif row[1] >= rd[row[2]]:
        rd[row[2]]=row[1]
        print(row)
输出将是

[120, 2, 'germany']
[123, 1, 'france']
[120, 2, 'germany']
[123, 1, 'france']

正如您所希望的

您可以尝试以下方法:

>>> (dfList.groupby('country', group_keys=False)
           .apply(lambda g: g[g.status == g.status.max()])
           .sort_index())
    ID  status  country
0  120       2  germany
2  123       1   france
4  120       2  germany
5  123       1   france

您可以尝试以下操作:

>>> (dfList.groupby('country', group_keys=False)
           .apply(lambda g: g[g.status == g.status.max()])
           .sort_index())
    ID  status  country
0  120       2  germany
2  123       1   france
4  120       2  germany
5  123       1   france

下面是使用
转换
在每个组中获得最大状态的步骤:

dfList[
    dfList['status'].eq(
        dfList.groupby('country')['status'].transform('max'))]
输出:

    ID  status  country
0  120   2      germany
2  123   1      france 
4  120   2      germany
5  123   1      france 

下面是使用
转换
在每个组中获得最大状态的步骤:

dfList[
    dfList['status'].eq(
        dfList.groupby('country')['status'].transform('max'))]
输出:

    ID  status  country
0  120   2      germany
2  123   1      france 
4  120   2      germany
5  123   1      france 

欢迎来到SO!我认为OP使用的是熊猫数据帧,而不是2d列表。另外,您可以在d
中使用
i[2]而不是
d.。\uu包含\uuu(i[2])
,这不是很习惯用法。两个块都有相同的动作
d[i[2]]=i
,因此您可以使用
连接谓词。@ggorlen我认为问题本身并不清楚。的确,它被标记为
pandas
,但同时OP表示数据是一个由其他列表组成的列表,因此看起来有点像ambiguous@perl不是真的——在OP的例子中,这些都是用来创建df的……如果你看一下,输出应该是这样的:…,它是一个列表列表,而不是一个数据帧,就像我说的,这不是100%清楚事实上我的问题不是100%清楚。我尝试了两种方法,将其保留为列表列表(最初是这样),或者将其转换为DF,然后再转换回列表。非常感谢您的投入。欢迎来到SO!我认为OP使用的是熊猫数据帧,而不是2d列表。另外,您可以在d
中使用
i[2]而不是
d.。\uu包含\uuu(i[2])
,这不是很习惯用法。两个块都有相同的动作
d[i[2]]=i
,因此您可以使用
连接谓词。@ggorlen我认为问题本身并不清楚。的确,它被标记为
pandas
,但同时OP表示数据是一个由其他列表组成的列表,因此看起来有点像ambiguous@perl不是真的——在OP的例子中,这些都是用来创建df的……如果你看一下,输出应该是这样的:…,它是一个列表列表,而不是一个数据帧,就像我说的,这不是100%清楚事实上我的问题不是100%清楚。我尝试了两种方法,将其保留为列表列表(最初是这样),或者将其转换为DF,然后再转换回列表。非常感谢您的投入。非常感谢您的建议。但是,只要列表中的第一个列表元素在[1]处包含较高的值,它就可以正常工作。否则,它将始终打印一个值较低的元素。非常感谢您的建议。但是,只要列表中的第一个列表元素在[1]处包含较高的值,它就可以正常工作。否则,它将始终打印一个值较低的元素。