关于另一个 csv、pandas 上的操作(聚合最大值)的相应 csv 值

Posted

技术标签:

【中文标题】关于另一个 csv、pandas 上的操作(聚合最大值)的相应 csv 值【英文标题】:Corresponding csv values with respect to operation(aggregate max) on another csv, pandas 【发布时间】:2021-01-09 23:53:00 【问题描述】:

我有两张均值表和标准值表,我想计算均值表某些列的最大值,并且我想得到标准值表的对应行。

mean_df = pd.read_csv(r'./csvs/mean.csv')

std_df = pd.read_csv(r'./csvs/std.csv')

#mean_df, std_df are of same size

grouped_df = mean_df.groupby(['alpha', 'beta'])

columns = ['val']
max_df = grouped_df[columns].agg(['max'])

# Here i want the corresponding std_max_df table for the max_df. i.e., for every max calculated from mean, i want the std of that max in a new table.

例如:

输入 mean_df 是

阿尔法贝塔伽马值

1 2 3 100

4 6 8 200

1 2 9 400

4 6 7 500

3 5 8 600


输入 std_df 是

阿尔法贝塔伽马值

1 2 3 300

4 6 8 500

1 2 9 100

4 6 7 700

3 5 8 900


输出将是

alpha beta gamma max_mean_val corresp_std_val

1 2 9 400 100

4 6 7 500 700

3 5 8 600 900


【问题讨论】:

您的问题到底是什么?请阅读How do I ask a good question?。特别是“在发布任何代码之前介绍问题”部分。 您现在可以调查一下吗?我基本上有两个表,我计算表 1 中某些列的最大值,我想要表 2 中的相应行 检查this question。 这能回答你的问题吗? Get the Row(s) which have the max count in groups using groupby 【参考方案1】:

首先通过内连接或左连接将DataFrames合并在一起,然后通过DataFrameGroupBy.idxmax获取具有最大索引值的行:

df = mean_df.merge(std_df, on=['alpha', 'beta','gamma'], 
                           how='left', 
                           suffixes=('_mean','_std'))

df = df.loc[df.groupby(['alpha', 'beta'])['val_mean'].idxmax()]
print (df)
   alpha  beta  gamma  val_mean  val_std
2      1     2      9       400      100
4      3     5      8       600      900
3      4     6      7       500      700

对于多列一个可能的想法:

print (mean_df)

   alpha  beta  gamma  val  val1
0      1     2      3  100     5
1      4     6      8  200     9
2      1     2      9  400     3
3      4     6      7  500     5
4      3     5      8  600     2

print (std_df)
   alpha  beta  gamma  val  val1
0      1     2      3  300     5
1      4     6      8  500     7
2      1     2      9  100     9
3      4     6      7  700     2
4      3     5      8  900     1


df = mean_df.merge(std_df, on=['alpha', 'beta','gamma'], 
                           how='left', 
                           suffixes=('_mean','_std'))

cols = ['val','val1']

dfs = [df.loc[df.groupby(['alpha', 'beta'])[f'col_mean'].idxmax(), 
              [f'col_mean', f'col_std']].reset_index(drop=True) for col in cols]

df0 = df[['alpha', 'beta','gamma']].drop_duplicates(['alpha','beta']).reset_index(drop=True)
df = pd.concat([df0] + dfs, axis=1)
print (df)
   alpha  beta  gamma  val_mean  val_std  val1_mean  val1_std
0      1     2      3       400      100          5         5
1      4     6      8       600      900          2         1
2      3     5      8       500      700          9         7

【讨论】:

好主意,我也在尝试使用merge,如何解决多个val列的问题,即val1_mean, val2_mean, val1_std, val2_std 对于多个 val 列,我通过多次获取 df.loc 并将“valx_std”列分配给最大 mean_df 来解决它。有没有更好的答案 @charanReddy - 为解决方案而努力,给他们一点时间。

以上是关于关于另一个 csv、pandas 上的操作(聚合最大值)的相应 csv 值的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:连接多个 .csv 文件并返回聚合了同名列的 Dataframe

pandas读写CSV操作

Pandas:DataFrameGroupby 的聚合

Pandas知识点超全总结

列和行操作 Python Pandas

pandas agg函数使用方法