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]处包含较高的值,它就可以正常工作。否则,它将始终打印一个值较低的元素。