Python Pandas从现有数据帧的所有行组合创建新的数据帧

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python Pandas从现有数据帧的所有行组合创建新的数据帧相关的知识,希望对你有一定的参考价值。

我有2个输入数据帧(df1df2),具有相同的结构,我想创建第三个(output_df),包含输入数据帧的所有行组合。

df1 = pd.DataFrame([["John","18","a"],["Jane","19","b"],["Jim","20","c"]],columns=['Name','Age','Function'])
df2 = pd.DataFrame([["Don","21","d"],["Diana","22","e"],["Dave","23","f"]],columns=['Name','Age','Function'])

output_df=pd.DataFrame([["John_Don","18_21","a_d"],
["John_Diana","18_22","a_e"],
["John_Dave","18_23","a_f"],
["Jane_Don","19_21","b_d"],
["Jane_Diana","19_22","b_e"],
["Jane_Dave","19_23","b_f"],
["Jim_Don","20_21","c_d"],
["Jim_Diana","20_22","c_e"],
["Jim_Dave","20_23","c_f"]],columns=['Name','Age','Function'])

新数据帧将具有初始数据帧的相应列的总和(“+”)。 (我知道字符串会被连接 - 如果输入是字符串,那就是我所追求的)

下面的代码创建了output_df,但它是空的,代码运行时间太长。以下示例代码仅作为输入运行2x10记录。最终,我将处理来自每个数据帧的数千条记录作为输入。

Q1:填充输出数据帧时我错过了什么?

Q2:如何让我的代码更高效?

output_df=pandas.DataFrame(columns=['Name','Age','Function'])
i=0
for lendf1 in range (10):
    for lendf2 in range(10):
        output_df=output_df.append(pandas.Series(),ignore_index=True)
        i=i+1
        for column in output_df:
            output_df[column][i]=df1[column][lendf1:lendf1+1]+df2[column][lendf2:lendf2+1]
答案

我想你正在尝试连接数据框的列。请尝试以下代码为您服务。

import pandas as pd

df1 = pd.DataFrame([["John","18","a"],["Jane","19","b"],["Jim","20","c"]],columns=['Name','Age','Function'])
df2 = pd.DataFrame([["Don","21","d"],["Diana","22","e"],["Dave","23","f"]],columns=['Name','Age','Function'])

cols = list(df1)

out_list = []
for ind1, row1 in df1.iterrows():
    for ind2, row2 in df2.iterrows():
        in_list = []
        for i in range(0, len(cols)):
            in_list.append(row1[cols[i]] + '_' + row2[cols[i]])
        out_list.append(in_list)

outdf = pd.DataFrame(out_list, columns=cols)
print outdf
另一答案

我相信你在寻找这个:

first = pd.Series(['a', 'b', 'c', 'd', 'e'])
second = pd.Series(['f', 'g', 'h', 'i', 'j'])
pd.DataFrame(np.add.outer(first, second))

输出:

    0   1   2   3   4
0  af  ag  ah  ai  aj
1  bf  bg  bh  bi  bj
2  cf  cg  ch  ci  cj
3  df  dg  dh  di  dj
4  ef  eg  eh  ei  ej

请注意,输入应为pd.Series类型,而不是数据帧。

以上是关于Python Pandas从现有数据帧的所有行组合创建新的数据帧的主要内容,如果未能解决你的问题,请参考以下文章

Python_Executing 来自 Pandas 数据帧的所有值的特定行

Pandas:确定从唯一行到原始数据帧的映射

评估来自两个数据帧的所有行组合

R如何排列数据帧的所有行,以便在列表中返回所有可能的行组合?

python pandas:仅将数据帧的结构(无行)导出到 SQL

如何通过对第 3 列中的值求和,将前 2 列中具有相同值的 Pandas Dataframe 行组合在一起?