Pandas:基于列名的列中位数

Pandas: Column medians based on column names

我有以下 pandas DataFrame。

df = pd.DataFrame(np.random.randn(3,6), columns=['A1','A2','A3','B1','B2','B3'])
df

           A1         A2          A3          B1          B2           B3
0   -0.409420   2.382457    1.151565    0.625461    0.224453    -0.351573
1   -0.676554   -1.485376   0.597227    0.240113    0.033963    1.224241
2   0.678698    1.392778    1.031625    0.388137    -0.566746   -0.798156

如何获得这样的列的中位数

        medA     medB
0        ...      ...
1        ...      ...
2        ...      ...   

我的实际数据框有300列,所以我想通过列名的相似性来区分。

这看起来像 pd.wide_to_long:

(pd.wide_to_long(df.reset_index(),['A','B'],'index','idx')
  .groupby('index').median().add_prefix('med_').rename_axis(None))

groupby 第一个字符串 axis=1

df.groupby(df.columns.str[0],axis=1).median().add_prefix('med_')

      med_A     med_B
0 -0.075465 -0.317335
1 -0.355822 -0.517270
2  0.279270 -1.134389

这是一个 for 循环答案:

dict = {}
dff = pd.DataFrame()

for letter in ['A', 'B']:
    dict[letter] = []
    for col in df.columns:
        if col.startswith(letter):
            dict[letter].append(col)
    dff[f'med_{letter}'] = df[dict[letter]].median(axis=1)

我不确定你所说的"to differentiate by similarity in column name"是什么意思,这里只是将每个列名的开头与引物列表中的条目进行比较(['A', 'B'])。