gpt4 book ai didi

python - Pandas Dataframe - 过滤数据以获得唯一的最大行和最小行

转载 作者:行者123 更新时间:2023-11-28 21:37:42 25 4
gpt4 key购买 nike

我有一个包含这 4 个数字列的数据框:['ID', 'A', 'B', 'C']

我想过滤数据以获得一个数据框,其中对于列 ID 中的每个唯一值,我得到行,不重复,它们对应于列 A 的最大值和最小值,B,C

下图显示了输入数据帧和所需的输出数据帧。

我还报告了 df#2 以蓝色突出显示与简单的最大/最小搜索不同的行。因为其中一些是重复的,然后应替换为第二/第三..最大/最小行。

例如,df2的第三行被替换为B列中第二个最大值的行(63),也就是的第三行>df1。同理,df2的第四行被替换为df1的第四行,因为它包含B列的次小值( -75)

另外:

  1. 列数可以改变,这意味着在更大的问题中,我可以拥有比 ['A'],['B']['C']

  2. ID 的行数可以改变

  3. 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?数据框很大(>100 万行),所以我不仅需要一个有效的解决方案,而且还需要一个高效的解决方案。

最佳答案

有一种只保留唯一行的快速方法:df3 = df1.reindex(set(index))。这将仅保留第一个最大值。现在,您可以通过 df1 = df1.drop(df3.index)df1 中删除具有第一个最大值的行,并根据需要多次重复整个过程(例如 3 次)

import pandas as pd
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])})

def keep_minmax(df1):
df_max = df1.groupby('ID')['A', 'B','C'].idxmax().as_matrix()
df_min = df1.groupby('ID')['A', 'B','C'].idxmin().as_matrix()
index = []
for i in range(len(df_max)):
for j in range(len(df_max[0])):
index.append(df_max[i][j])
index.append(df_min[i][j])
return df1.reindex(set(index))

df = df1.copy()
results = []
for i in range(3):
result = keep_minmax(df)
result['order'] = i + 1
results.append(result)
df = df.drop(result.index)
df3 = pd.concat(results).sort_values(['ID', 'order'])
print(df3)

会输出

        A      B      C   ID  order
0 100.0 99.0 98.0 1.0 1
1 -97.0 -96.0 -95.0 1.0 1
2 -56.0 63.0 -45.0 1.0 2
3 69.0 -75.0 39.0 1.0 2
4 150.0 140.0 130.0 2.0 1
5 -120.0 -110.0 -100.0 2.0 1
6 30.0 91.0 90.0 2.0 2
7 92.0 -62.0 -50.0 2.0 2
10 -75.0 2.0 33.0 2.0 2
8 35.0 76.0 70.0 2.0 3
9 -41.0 10.0 -17.0 2.0 3

您可以看到对于 ID=1没有三阶,因为 df1 中的所有行都已经用完了,您将不得不包含重复的行(如您的示例 df3 所示)。 你真的想要吗?

我在问这个,因为从你的帖子中不清楚在模棱两可的情况下该怎么做:如果不同的行对应于不同列中的第 k 个最佳值,或者如果此 k 本身对于不同的列是不同的。例如,您将从这样的 df 中生成什么样的 df3,为什么?为简单起见,我们只提取最大值:

   A  B   ID
0 2 1 1.0
1 3 2 1.0
2 1 0 1.0
3 0 3 1.0

我的算法(只寻找最大值)会返回

   A  B   ID  order
1 3 2 1.0 1
3 0 3 1.0 1
0 2 1 1.0 2
2 1 0 1.0 3

请注意,A 排在第 2 位,B 排在第 3 位的行 (2, 1) 包含在第 2 个顺序中,因为它更高。

对于如何处理此类歧义,您有任何其他建议吗?

关于python - Pandas Dataframe - 过滤数据以获得唯一的最大行和最小行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49089325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com