选择 pandas 数据帧合并中的特定行
Selecting specific rows in pandas dataframe merging
我保留的数组中有 4 个数据帧。
0 1 2
0 0.0 1.0 2.0
1 0.0 1.0 2.0
2 0.0 1.0 2.0
3 0.0 1.0 2.0
4 0.0 2.0 3.0
5 0.0 2.0 3.0
6 0.0 3.0 4.0
7 0.0 3.0 4.0
0 1 2
0 1.0 4.0 4.0
1 1.0 5.0 5.0
0 1 2
0 2.0 6.0 4.0
0 1 2
0 3.0 7.0 6.0
大致上我想做的是根据特定条件组合这些数据帧。例如,将第一个数据框中第0行第1列的值开始的数据框添加到第一个数据框中。因此,第一个数据帧采用如下格式:
0 1 2 3 4 5
0 0.0 1.0 2.0
1 0.0 1.0 2.0
2 0.0 1.0 2.0 1.0 4.0 4.0
3 0.0 1.0 2.0 1.0 5.0 5.0
4 0.0 2.0 3.0
5 0.0 2.0 3.0 2.0 6.0 4.0
6 0.0 3.0 4.0
7 0.0 3.0 4.0 3.0 7.0 6.0
字典格式的数据状态。
{0: {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0, 6: 0.0, 7: 0.0}, 1: {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0, 4: 2.0, 5: 2.0, 6: 3.0, 7: 3.0}, 2: {0: 2.0, 1: 2.0, 2: 2.0, 3: 2.0, 4: 3.0, 5: 3.0, 6: 4.0, 7: 4.0}}
{0: {0: 1.0, 1: 1.0}, 1: {0: 4.0, 1: 5.0}, 2: {0: 4.0, 1: 5.0}}
{0: {0: 2.0}, 1: {0: 6.0}, 2: {0: 4.0}}
{0: {0: 3.0}, 1: {0: 7.0}, 2: {0: 6.0}}
我也试过各种算法,也未能解决这部分的问题
如果 1
所在的行在第一个数据帧上保持不变,您可以尝试一下索引,让我们创建数据帧:
df = pd.DataFrame({0: {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0, 6: 0.0, 7: 0.0}, 1: {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0, 4: 2.0, 5: 2.0, 6: 3.0, 7: 3.0}, 2: {0: 2.0, 1: 2.0, 2: 2.0, 3: 2.0, 4: 3.0, 5: 3.0, 6: 4.0, 7: 4.0}})
df_1 = pd.DataFrame({0: {0: 1.0, 1: 1.0}, 1: {0: 4.0, 1: 5.0}, 2: {0: 4.0, 1: 5.0}})
df_2 = pd.DataFrame({0: {0: 2.0}, 1: {0: 6.0}, 2: {0: 4.0}})
df_3 = pd.DataFrame({0: {0: 3.0}, 1: {0: 7.0}, 2: {0: 6.0}})
重命名 df_X 的列:
df_1.columns = [4, 5, 6]
df_2.columns = [4, 5, 6]
df_3.columns = [4, 5, 6]
然后:使用 index
和 1
作为键,使用 cumcount
, then merge
数据帧更改 df
的 index
,最后,使用 iloc 和将 nan 值移动到 thop
df.index = df.groupby(1).cumcount()
df_merged = df.reset_index().merge(
pd.concat([df_1, df_2, df_3], axis=0).reset_index(),
left_on=(1, 'index'),
right_on=(4, 'index'),
how='left'
).drop('index', axis=1)
df_merged.groupby(1).apply(
lambda df: df.iloc[
np.roll(np.arange(df.shape[0]), df[4].isnull().sum())
]
).reset_index(drop=True)
# 0 1 2 4 5 6
# 0 0.0 1.0 2.0 NaN NaN NaN
# 1 0.0 1.0 2.0 NaN NaN NaN
# 2 0.0 1.0 2.0 1.0 4.0 4.0
# 3 0.0 1.0 2.0 1.0 5.0 5.0
# 4 0.0 2.0 3.0 NaN NaN NaN
# 5 0.0 2.0 3.0 2.0 6.0 4.0
# 6 0.0 3.0 4.0 NaN NaN NaN
# 7 0.0 3.0 4.0 3.0 7.0 6.0
首先,将 df2
、df3
、df4
的列从 0,1,2 重命名为 3,4,5
for df in [df2, df3, df4]:
df.rename(columns={0:3, 1:4, 2:5}, inplace=True)
其次,将这些列的索引更改为要在 df1
中附加它们的行索引
df2.index = [2,3]
df3.index = [5]
df4.index = [7]
现在,您可以使用两个连续的 pd.concat
来获得预期的数据帧输出。第一个连接在行中连接 df2
、df3
和 df4
,第二个连接将此输出连接到列上的 df1
,如下所示:
pd.concat([df1,pd.concat([df2, df3, df4], axis=0)], axis=1 )
输出
0 1 2 3 4 5
0 0.0 1.0 2.0 NaN NaN NaN
1 0.0 1.0 2.0 NaN NaN NaN
2 0.0 1.0 2.0 1.0 4.0 4.0
3 0.0 1.0 2.0 1.0 5.0 5.0
4 0.0 2.0 3.0 NaN NaN NaN
5 0.0 2.0 3.0 2.0 6.0 4.0
6 0.0 3.0 4.0 NaN NaN NaN
7 0.0 3.0 4.0 3.0 7.0 6.0
我保留的数组中有 4 个数据帧。
0 1 2
0 0.0 1.0 2.0
1 0.0 1.0 2.0
2 0.0 1.0 2.0
3 0.0 1.0 2.0
4 0.0 2.0 3.0
5 0.0 2.0 3.0
6 0.0 3.0 4.0
7 0.0 3.0 4.0
0 1 2
0 1.0 4.0 4.0
1 1.0 5.0 5.0
0 1 2
0 2.0 6.0 4.0
0 1 2
0 3.0 7.0 6.0
大致上我想做的是根据特定条件组合这些数据帧。例如,将第一个数据框中第0行第1列的值开始的数据框添加到第一个数据框中。因此,第一个数据帧采用如下格式:
0 1 2 3 4 5
0 0.0 1.0 2.0
1 0.0 1.0 2.0
2 0.0 1.0 2.0 1.0 4.0 4.0
3 0.0 1.0 2.0 1.0 5.0 5.0
4 0.0 2.0 3.0
5 0.0 2.0 3.0 2.0 6.0 4.0
6 0.0 3.0 4.0
7 0.0 3.0 4.0 3.0 7.0 6.0
字典格式的数据状态。
{0: {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0, 6: 0.0, 7: 0.0}, 1: {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0, 4: 2.0, 5: 2.0, 6: 3.0, 7: 3.0}, 2: {0: 2.0, 1: 2.0, 2: 2.0, 3: 2.0, 4: 3.0, 5: 3.0, 6: 4.0, 7: 4.0}}
{0: {0: 1.0, 1: 1.0}, 1: {0: 4.0, 1: 5.0}, 2: {0: 4.0, 1: 5.0}}
{0: {0: 2.0}, 1: {0: 6.0}, 2: {0: 4.0}}
{0: {0: 3.0}, 1: {0: 7.0}, 2: {0: 6.0}}
我也试过各种算法,也未能解决这部分的问题
如果 1
所在的行在第一个数据帧上保持不变,您可以尝试一下索引,让我们创建数据帧:
df = pd.DataFrame({0: {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0, 6: 0.0, 7: 0.0}, 1: {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0, 4: 2.0, 5: 2.0, 6: 3.0, 7: 3.0}, 2: {0: 2.0, 1: 2.0, 2: 2.0, 3: 2.0, 4: 3.0, 5: 3.0, 6: 4.0, 7: 4.0}})
df_1 = pd.DataFrame({0: {0: 1.0, 1: 1.0}, 1: {0: 4.0, 1: 5.0}, 2: {0: 4.0, 1: 5.0}})
df_2 = pd.DataFrame({0: {0: 2.0}, 1: {0: 6.0}, 2: {0: 4.0}})
df_3 = pd.DataFrame({0: {0: 3.0}, 1: {0: 7.0}, 2: {0: 6.0}})
重命名 df_X 的列:
df_1.columns = [4, 5, 6]
df_2.columns = [4, 5, 6]
df_3.columns = [4, 5, 6]
然后:使用 index
和 1
作为键,使用 cumcount
, then merge
数据帧更改 df
的 index
,最后,使用 iloc 和将 nan 值移动到 thop
df.index = df.groupby(1).cumcount()
df_merged = df.reset_index().merge(
pd.concat([df_1, df_2, df_3], axis=0).reset_index(),
left_on=(1, 'index'),
right_on=(4, 'index'),
how='left'
).drop('index', axis=1)
df_merged.groupby(1).apply(
lambda df: df.iloc[
np.roll(np.arange(df.shape[0]), df[4].isnull().sum())
]
).reset_index(drop=True)
# 0 1 2 4 5 6
# 0 0.0 1.0 2.0 NaN NaN NaN
# 1 0.0 1.0 2.0 NaN NaN NaN
# 2 0.0 1.0 2.0 1.0 4.0 4.0
# 3 0.0 1.0 2.0 1.0 5.0 5.0
# 4 0.0 2.0 3.0 NaN NaN NaN
# 5 0.0 2.0 3.0 2.0 6.0 4.0
# 6 0.0 3.0 4.0 NaN NaN NaN
# 7 0.0 3.0 4.0 3.0 7.0 6.0
首先,将 df2
、df3
、df4
的列从 0,1,2 重命名为 3,4,5
for df in [df2, df3, df4]:
df.rename(columns={0:3, 1:4, 2:5}, inplace=True)
其次,将这些列的索引更改为要在 df1
df2.index = [2,3]
df3.index = [5]
df4.index = [7]
现在,您可以使用两个连续的 pd.concat
来获得预期的数据帧输出。第一个连接在行中连接 df2
、df3
和 df4
,第二个连接将此输出连接到列上的 df1
,如下所示:
pd.concat([df1,pd.concat([df2, df3, df4], axis=0)], axis=1 )
输出
0 1 2 3 4 5
0 0.0 1.0 2.0 NaN NaN NaN
1 0.0 1.0 2.0 NaN NaN NaN
2 0.0 1.0 2.0 1.0 4.0 4.0
3 0.0 1.0 2.0 1.0 5.0 5.0
4 0.0 2.0 3.0 NaN NaN NaN
5 0.0 2.0 3.0 2.0 6.0 4.0
6 0.0 3.0 4.0 NaN NaN NaN
7 0.0 3.0 4.0 3.0 7.0 6.0