使用正则表达式从pandas dataframe的列创建对字典

xu3bshqb  于 2023-03-28  发布在  其他
关注(0)|答案(4)|浏览(86)

我有以下 Dataframe

import pandas as pd
df = pd.DataFrame({'Original': [92,93,94,95,100,101,102],
             'Sub_90': [99,98,99,100,102,101,np.nan],
             'Sub_80': [99,98,99,100,102,np.nan,np.nan],
             'Gen_90': [99,98,99,100,102,101,101],
             'Gen_80': [99,98,99,100,102,101,100]})

我想创建以下字典

{
    'Gen_90': 'Original',
    'Sub_90': 'Gen_90',
    'Gen_80': 'Original',
    'Sub_80': 'Gen_80',
 }

使用regex(因为在我的原始数据中,我也有Gen_70, Gen_60, ... , Gen_10Sub_70, Sub_60, ... , Sub_10
因此,我想为相同的_number创建SubGen对,并将OriginalGen配对
我怎么能这么做?

jk9hmnmh

jk9hmnmh1#

您可以:

gen_cols = df.filter(like='Gen_').columns
sub_cols = df.filter(like='Sub_').columns
d = dict(zip(sorted(sub_cols), sorted(gen_cols)))
d.update({g : 'Original' for g in gen_cols})
print(d)

{'Sub_80': 'Gen_80',
 'Sub_90': 'Gen_90',
 'Gen_90': 'Original',
 'Gen_80': 'Original'}
vxf3dgd4

vxf3dgd42#

您可以用途:

cols = df.sort_index(axis=1).columns
group = cols[::-1].str.extract(r'_(\d+)', expand=False)

out = {a: b for l in map(list, cols.groupby(group).values())
       for a,b in zip(l, ['Original']+l)}

无论输入的顺序如何,这都应该起作用。
输出:

{'Gen_90': 'Original',
 'Sub_90': 'Gen_90',
 'Gen_80': 'Original',
 'Sub_80': 'Gen_80'}
q43xntqr

q43xntqr3#

你可以使用一个简单的循环:

l = sorted(df.columns[1:])  # exclude 'Original' column as it's common
d = {}

# split other columns into two sublist: one for Gen_XX and another for Sub_XX
for g, s in zip(l[:len(l)//2], l[len(l)//2:]):
    d[g] = 'Original'
    d[s] = g

输出:

>>> d
{'Gen_80': 'Original',
 'Sub_80': 'Gen_80',
 'Gen_90': 'Original',
 'Sub_90': 'Gen_90'}
kgsdhlau

kgsdhlau4#

replace使用字典理解,并在_之后按数字排序:

d = {x:'Original' if x.startswith('Gen') else x.replace('Sub','Gen')
      for x in sorted(df.columns.drop('Original'), 
                      key=lambda x: (-int(x.split('_')[1]), x.split('_')[0]))}
print (d)

{'Gen_90': 'Original', 
 'Sub_90': 'Gen_90', 
 'Gen_80': 'Original', 
 'Sub_80': 'Gen_80'}

相关问题