在多个数据帧之间选择

2024-05-05 03:50:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有多个数据帧,比如df_0,df_1,dg_0,dg_1,具有相同的索引和列

乙二醇

df_0=pd.DataFrame({"A":[0,1,2],"B":[3,3,0]})

df_1=pd.DataFrame({"A":[3,5,1],"B":[2,1,1]})

dg_0=pd.DataFrame({"A":['a','b','c'],"B":['d','e','f']})

dg_1=pd.DataFrame({"A":['g','h','i'],"B":['j','k','l']})

我想根据df_0还是df_1更大,在dg_0和dg_1之间进行选择

因此,最终输出应为:

df_out=pd.DataFrame({"A":['g','h','c'],"B":['d','e','l']})

作为中间步骤,我可以将dh定义为df_0和df_1的idxmax,在本例中应为:

dh=pd.DataFrame({"A":[1,1,0],"B":[0,0,1]})

然后尝试使用dh在dg_0和dg_1之间进行选择

我认为这有助于创建dh:

dh=pd.concat([df_0,df_1],axis=1,keys=['0','1']).groupby(levels=1).idxmax().applymap(lambda x:x[0])

但是我很难弄明白怎么把DFU弄出来。非常感谢您的建议


Tags: 数据dataframedf定义步骤keysoutpd
1条回答
网友
1楼 · 发布于 2024-05-05 03:50:38

您可以使用熊猫^{}^{}

df_mask = df_0.gt(df_1)
df_out = dg_0[df_mask]
df_out.update(dg_1.mask(df_mask))

输出:

   A  B
0  g  d
1  h  e
2  c  l

要使其可扩展到多个数据帧和列,请执行以下操作:

  • 选项1:
dfs = [df_0, df_1] # list of dataframes
dgs = [dg_0, dg_1] # second list of dataframes (dgs)

# Concatenate dataframes
df = pd.concat(dfs, axis=1)
dg = pd.concat(dgs, axis=1)
df.columns = range(len(df.columns))

# Get the indexes of maximum values per target-columns
ncol = dfs[0].shape[1]
idx = {k: df.iloc[:, i::ncol].idxmax(1) for i,k in enumerate(dfs[0].columns)}

# Retrieve data from dg (target output)
df_out = pd.DataFrame({k: [dg.iloc[i,v] for i,v in idx[k].iteritems()] for k in idx})
  • 选项2(掩码):
dfs = [df_0, df_1] # list of dataframes
dgs = [dg_0, dg_1] # second list of dataframes (dgs)

# Concatenate dataframes
df = pd.concat(dfs, axis=1)
dg = pd.concat(dgs, axis=1)
df.columns = range(len(df.columns))
dg.columns = range(len(dg.columns))

# Get data for target-columns
ncol = dfs[0].shape[1]
col_data = {k: df.iloc[:, i::ncol] for i,k in enumerate(dfs[0].columns)}

# Mask non-maximum values per target-columns
col_mask = {k: ~col_data[k].eq(col_data[k].max(1), axis='rows') for k in idx}

# Retrieve data from dg (target output)
df_out = pd.DataFrame({k: dg.iloc[:, i::ncol].mask(col_mask[k]).stack().values for i,k in enumerate(col_mask)})

它们的输出与原始答案相同

相关问题 更多 >