如何从另一个数据框中扩展数据框中的值[重复]
Posted
技术标签:
【中文标题】如何从另一个数据框中扩展数据框中的值[重复]【英文标题】:How to expand values in a dataframe from another dataframe [duplicate] 【发布时间】:2020-10-10 18:32:43 【问题描述】:例如,考虑两个数据帧 A 和 B
数据框 A:
Name1 | Col1 | Col2
------+------+-----
A | 1 | 2
B | 4 | 3
C | 6 | 8
和数据框 B:
Name2 | Col3 | Col4
------+------+-----
P | 5 | 9
Q | 0 | 1
R | 2 | 7
我希望将它们转换成一个数据框,例如
新数据框:
Name1 | Col1 | Col2 | Name2 | Col3 | Col4
------+------+------+-------+------+------
A | 1 | 2 | P | 5 | 9
A | 1 | 2 | Q | 0 | 1
A | 1 | 2 | R | 2 | 7
B | 4 | 3 | P | 5 | 9
B | 4 | 3 | Q | 0 | 1
B | 4 | 3 | R | 2 | 7
C | 6 | 8 | P | 5 | 9
C | 6 | 8 | Q | 0 | 1
C | 6 | 8 | R | 2 | 7
我怎样才能改变它?
【问题讨论】:
这是什么逻辑?知道这会很有帮助。 嗯,我需要做这件事来准备我为我的 ML 模型 @ShubhamSharma 建立的数据。 但是为什么key只复制了3次,这里应该有一些逻辑吧? @ShubhamSharma 这个名字实际上代表了 github 提交哈希和文件。这很复杂,但正如我所说,这一切都将用于 ML 模型 哦,笛卡尔积!!!这就是我要找的词。我想是的,这正是我想要的。谢谢人 【参考方案1】:df1['key'] = 0
df2['key'] = 0
new_df = pd.merge(df1, df2, on='key').drop('key', axis=1)
print(new_df)
打印:
Name1 Col1 Col2 Name2 Col3 Col4
0 A 1 2 P 5 9
1 A 1 2 Q 0 1
2 A 1 2 R 2 7
3 B 4 3 P 5 9
4 B 4 3 Q 0 1
5 B 4 3 R 2 7
6 C 6 8 P 5 9
7 C 6 8 Q 0 1
8 C 6 8 R 2 7
【讨论】:
【参考方案2】:你可以做的是这样的
A2 = A.copy()
B2 = B.copy()
DUMMY = 'dummy'
A2[DUMMY] = 1
B2[DUMMY] = 1
df = pd.merge(A2,B2)
df = df.loc[:,df.columns != DUMMY]
它起作用的原因是在它们匹配的所有值的公共“虚拟”列上合并连接。假设 dummy 是常数,所有的组合都匹配。
【讨论】:
【参考方案3】:这是一个使用 numpy 进行数据转换的答案,基本思想是复制 df1
中的行与 df2
中的行一样多次。
n_cols = df1.shape[1]
vals = [np.hstack([np.repeat(df1.iloc[i,:], n_cols).values.reshape(-1, n_cols), df2.values])
for i in range(len(df1))]
f = pd.DataFrame(np.vstack(vals), columns=df1.columns.tolist() + df2.columns.tolist())
print(f)
Name1 Col1 Col2 Name2 Col3 Col4
0 A A A P 5 9
1 1 1 1 Q 0 1
2 2 2 2 R 2 7
3 B B B P 5 9
4 4 4 4 Q 0 1
5 3 3 3 R 2 7
6 C C C P 5 9
7 6 6 6 Q 0 1
8 8 8 8 R 2 7
【讨论】:
以上是关于如何从另一个数据框中扩展数据框中的值[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Spark基于其他数据框中的列对数据框中的列进行重复数据删除