我有这样的数据:
df = pd.DataFrame({
'nameset1_0': [np.nan, 'A', 'B', 'C', np.nan],
'nameset1_1': ['D', np.nan, 'E', 'F', 'G'],
'nameset1_2': ['H', np.nan, np.nan, np.nan, np.nan],
'nameset2_0': ['H', 'A', 'E', 'F', np.nan],
'nameset2_1': ['D', np.nan, np.nan, 'C', 'G'],
'nameset2_2': [np.nan, np.nan, 'B', np.nan, np.nan],
'nameset2_val_0': [6, 76, 7, 34, 30],
'nameset2_val_1': [33, 97, 73, 21, 45],
'nameset2_val_2': [53, 28, 47, 94, 34]
})
对于nameset2
,每个_0
、_1
、_2
后缀nameset2_val_
列中的值都对应于带有相应后缀的nameset2_
列中的名称/标签
在nameset1_
和nameset2_
列之间的每一行中都有相同的值集,但每一行中的洗牌方式不同
我需要做的是为nameset1
创建一组值列,使nameset2
值与nameset1_
中的适当名称正确匹配。输出应如下所示(我尽可能小心,但如果您认为此处有错误,请发表评论):
df = pd.DataFrame({
'nameset1_0': [np.nan, 'A', 'B', 'C', np.nan],
'nameset1_1': ['D', np.nan, 'E', 'F', 'G'],
'nameset1_2': ['H', np.nan, np.nan, np.nan, np.nan],
'nameset2_0': ['H', 'A', 'E', 'F', np.nan],
'nameset2_1': ['D', np.nan, np.nan, 'C', 'G'],
'nameset2_2': [np.nan, np.nan, 'B', np.nan, np.nan],
'nameset2_val_0': [6, 76, 7, 34, np.nan],
'nameset2_val_1': [33, np.nan, np.nan, 21, 45],
'nameset2_val_2': [np.nan, np.nan, 47, np.nan, np.nan],
'nameset1_val_0': [np.nan, 76, 47, 21, np.nan],
'nameset1_val_1': [33, np.nan, 7, 34, 45],
'nameset1_val_2': [6, np.nan, np.nan, np.nan, np.nan]
})
我试图处理此问题的疯狂笨拙的代码目前看起来是这样的,但它的工作方式不一致或根本不起作用:
for i in list(range(3)):
df['nameset1_val_'+str(i)] = df[
['nameset1_'+str(i)]
+['nameset2_val_'+str(j) for j in list(range(3))]
].apply(
lambda row: [i for i,e in enumerate(row[1:]) if e==row[0]],
axis=1
).apply(lambda lst: lst.pop() if len(lst)==1 else np.nan)
prefix='nameset2_val_'
df['nameset1_val_'+str(i)] = df[
['nameset2_val_'+str(i) for i in list(range(3))]
].to_numpy()[df.index,
df.columns.get_indexer(
df['nameset1_val_'+str(i)].fillna(-1).astype(int).astype(str).radd(prefix)
)]
另一种选择:
m
:我相信这能满足你的需要。nameset_dict将所需的所有转换从某个字符映射到一个整数,然后使用replace创建新列
这就是我得到的结果
你可以做:
相关问题 更多 >
编程相关推荐