使用正则表达式从 pandas 数据框中的列中创建对字典

问题描述 投票:0回答:4

我有以下数据框

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_10
Sub_70, Sub_60, ... , Sub_10

所以我想为相同的

Sub
创建成对的
Gen
_number
以及成对或
Original
Gen
s

我怎么能那样做?

python pandas dictionary
4个回答
3
投票

你可以这样做:

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'}

2
投票

您可以使用:

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'}

2
投票

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

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'}

2
投票

使用

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'}
© www.soinside.com 2019 - 2024. All rights reserved.