我有以下数据框
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
我怎么能那样做?
你可以这样做:
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'}
您可以使用:
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'}
你可以使用一个简单的循环:
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'}
使用
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'}