【发布时间】:2018-08-11 20:39:25
【问题描述】:
我有一个包含这 4 个数字列的数据框:['ID', 'A', 'B', 'C']
我想过滤数据以获得一个数据框,其中对于列 ID 中的每个唯一值,我得到行,不重复,它们对应于 A 列的最大值和最小值,B,C
下图显示了输入数据帧和所需的输出数据帧。
我还报告了 df #2,以蓝色突出显示与简单的最大/最小搜索不同的行。因为其中一些是重复的,然后应该替换为第二/第三..最大/最小行。
例如,df2 的第三行替换为B (63) 列中包含第二个最大值的行,即df1 的第三行。同理,将df2的第四行替换为df1的第四行,因为它包含B列的第二个最小值(-75)
此外:
列数可以改变,这意味着在更大的问题中,我可以有更多的列,而不仅仅是
['A']、['B']和['C']ID的行数可以改变
df3的总行数应该是
UniqueID*Columns*2
目前我只能使用 idxmax() / idxmin() 和 reindex 获取 df2 数据帧
df1 = pd.DataFrame({'ID': pd.Series([1. ,1. , 1. , 1 , 2 , 2, 2,2,2,2,2]),
'A': pd.Series([100. , -97. , -56. , 69 , 150 , -120, 30,92,35,-41,-75]),
'B': pd.Series([99., -96., 63., -75., 140, -110, 91,-62,76,10,2]),
'C': pd.Series([98., -95., -45., 39., 130, -100,90,-50,70,-17,33])})
max = df1.groupby('ID')['A', 'B','C'].idxmax().as_matrix()
min = df1.groupby('ID')['A', 'B','C'].idxmin().as_matrix()
index = []
for i in range(len(max)):
for j in range(len(max[0])):
index.append(max[i][j])
index.append(min[i][j])
df2 = df1.reindex(index)
我怎样才能获得 df3?数据框很大(>1M 行),所以我不仅需要一个有效的解决方案,还需要一个高效的解决方案。
【问题讨论】:
-
我似乎无法理解您要做什么。
-
基本上我需要为列 ID 中的每个唯一值找到在列 P、D 和 C 中具有最大值的行。然后重新创建仅包含最大行的数据框。但我需要用第二个最大值替换重复的行
-
所以对于每个唯一 ID,您需要 3 行,即最大 P、最大 D 和最大 C 的行?
-
是的,我已经能够使用 idmax() 做到这一点。但这给了我一些重复的行。例如当 D 的最大值的行与 P 相同时
-
那么 ID 0 也有重复的行,那你为什么要保持原样呢?
标签: python pandas dataframe replace duplicates