基于第二帧的重复行

时间:2020-03-30 15:06:07

标签: pandas dataframe

我想寻求您的支持。我尝试了很多事情,但没有成功。

假设您有两个不同的帧,长帧(LF)(行数高)和短帧(SF)(行数低),请参见示例

SF=pd.DataFrame({"col1":[1,2,3],"col2":[4,5,6]})
LF=pd.DataFrame({"col_long":[1,2,3,4,5,6,7,8,9,10,11]})

我需要遍历短帧中特定列的值,假设我们在两个帧中都沿轴1进行“测试col2”和concat的连接。我有一个可行的解决方案,如下所示:

EMPTY_FRAME=pd.DataFrame()
SF=pd.DataFrame({"col1":[1,2,3],"col2":[4,5,6]})
LF=pd.DataFrame({"col_long":[1,2,3,4,5,6,7,8,9,10,11]})


for i in range(len(SF.index)):
    LF["col1"]=SF["col1"].values[i]
    LF["col2"]=SF["col2"].values[i]
    EMPTY_FRAME=EMPTY_FRAME.append(LF)

LF=   col_long  col1  col2
0          1     1     4
1          2     1     4
2          3     1     4
3          4     1     4
4          5     1     4
5          6     1     4
6          7     1     4
7          8     1     4
8          9     1     4
9         10     1     4
10        11     1     4
0          1     2     5
1          2     2     5
2          3     2     5
3          4     2     5
4          5     2     5
5          6     2     5
6          7     2     5
7          8     2     5
8          9     2     5
9         10     2     5
10        11     2     5
0          1     3     6
1          2     3     6
2          3     3     6
3          4     3     6
4          5     3     6
5          6     3     6
6          7     3     6
7          8     3     6
8          9     3     6
9         10     3     6
10        11     3     6

但是变得非常混乱,因为我在SF中有很多列,因此我可能会忘记一些列。那么问题来了:是否有可能以更好和更短的方式解决以下问题?

如果你们对如何进一步改进我的代码有所了解,我将不胜感激

1 个答案:

答案 0 :(得分:1)

您可以与reindex交叉连接以保留顺序:

out = (SF.assign(k=1).merge(LF.assign(k=1),on='k').drop('k',1)
   .reindex(columns=LF.columns.union(SF.columns,sort=False)))

out.index = out['col_long'].factorize()[0] #if required

print(out)

    col_long  col1  col2
0          1     1     4
1          2     1     4
2          3     1     4
3          4     1     4
4          5     1     4
5          6     1     4
6          7     1     4
7          8     1     4
8          9     1     4
9         10     1     4
10        11     1     4
0          1     2     5
1          2     2     5
2          3     2     5
3          4     2     5
4          5     2     5
5          6     2     5
6          7     2     5
7          8     2     5
8          9     2     5
9         10     2     5
10        11     2     5
0          1     3     6
1          2     3     6
2          3     3     6
3          4     3     6
4          5     3     6
5          6     3     6
6          7     3     6
7          8     3     6
8          9     3     6
9         10     3     6
10        11     3     6