我遇到一个问题,即我有一个长数据框和一个短数据框,我想合并,以便较短的数据框重复自身以填充较长的(左)df的长度。
df1:
| Index | Wafer | Chip | Value |
---------------------------------
| 0 | 1 | 32 | 0.99 |
| 1 | 1 | 33 | 0.89 |
| 2 | 1 | 39 | 0.96 |
| 3 | 2 | 32 | 0.81 |
| 4 | 2 | 33 | 0.87 |
df2:
| Index | x | y |
-------------------------
| 0 | 1 | 3 |
| 1 | 2 | 2 |
| 2 | 1 | 6 |
df_combined:
| Index | Wafer | Chip | Value | x | y |
-------------------------------------------------
| 0 | 1 | 32 | 0.99 | 1 | 3 |
| 1 | 1 | 33 | 0.89 | 2 | 2 |
| 2 | 1 | 39 | 0.96 | 1 | 6 |
| 3 | 2 | 32 | 0.81 | 1 | 3 | <--- auto-repeats...
| 4 | 2 | 33 | 0.87 | 2 | 2 |
这是内置的join / merge-type,还是需要某种循环?
{这只是错误的数据,但dfs超过1000行...}
当前代码是一个简单的外部合并,但没有提供结束的填充/重复:
df = main.merge(df_coords, left_index=True, right_index = True, how='outer')
并给出NaN。
我检查了一下: Merge two python pandas data frames of different length but keep all rows in output data frame pandas: duplicate rows from small dataframe to large based on cell value
感觉这可能是合并功能中某处的争论……但我找不到它。 非常感谢您的帮助。
谢谢
答案 0 :(得分:2)
您可以重复df2
直到其长度为df1
,然后重复reset_index
和merge
:
new_len = round(len(df1)/len(df2))
repeated = (pd.concat([df2] * new_len)
.reset_index()
.drop(["index"], 1)
.iloc[:len(df1)])
repeated
x y
0 1 3
1 2 2
2 1 6
3 1 3
4 2 2
df1.merge(repeated, how="outer", left_index=True, right_index=True)
Wafer Chip Value x y
0 1 32 0.99 1 3
1 1 33 0.89 2 2
2 1 39 0.96 1 6
3 2 32 0.81 1 3
4 2 33 0.87 2 2
有点hacky,但应该可以。
注意:我假设您的Index
列实际上不是一列,但实际上旨在表示数据帧索引。我之所以这样做是因为您在left_index
代码中引用了right_index
/ merge()
args。如果Index
实际上是其自己的列,则此代码基本上可以正常工作,如果您不希望在最后的{{1}中使用它,则也只需drop
Index
}。
答案 1 :(得分:0)
您可以通过在df1["Index"]
的长度上df2["Index"]
的左连接处实现此连接:
# Creating Modular Index values on df1
n = df2.shape[0]
df1["Modular Index"] = df1["Index"].apply(lambda x: str(int(x)%n))
# Merging dataframes
df_combined = df1.merge(df2, how="left", left_on="Modular Index", right_on="Index")
# Dropping unnecessary columns
df_combined = df_combined.drop(["Modular Index", "Index_y"], axis=1)
print(df_combined)
0 Index_x Wafer Chip Value x y
0 0 1 32 0.99 1 3
1 1 1 33 0.89 2 2
2 2 1 39 0.96 1 6
3 3 2 32 0.81 1 3
4 4 2 33 0.87 2 2