熊猫根据值乘以生成行

时间:2019-01-07 15:24:19

标签: python-3.x pandas

我在单独的csv文件中有两个表。

Rad

ID/Key  ID  RowKey  RadKey  RadStart    RadStop
 A16    A1    6       4     1/1/2018    2/1/2018
 A16    A1    6       5     3/1/2018    4/1/2018
 A17    A1    7       6     4/1/2018    5/1/2018
 A17    A1    7       7     5/1/2018    6/1/2018

马尼

ID/Key  ID   RowKey   Order Date     Order ID
A16     A1     6       1/1/2015   1234-USF-0075
A16     A1     6       1/1/2015   1234-USF-0076
A16     A1     6       1/1/2015   1234-USF-0077
A17     A1     7       1/1/2015   1234-USF-0075
A17     A1     7       1/1/2015   1234-USF-0077

我需要编写一个新文件,对于每个RadKey,将整个RadKey行写入n次,其中nID/Key对以Mani的形式乘以该RadKeys对的ID/Key的数量。新生成的文件的每一行应包含Order Date中的Order IDMani

生成的文件

ID  RowKey  RadKey  RadStart    RadStop    Order Date     Order ID
A1  6        4      1/1/2018    2/1/2018    1/1/2015    1234-USF-0075
A1  6        4      1/1/2018    2/1/2018    1/1/2015    1234-USF-0076
A1  6        4      1/1/2018    2/1/2018    1/1/2015    1234-USF-0077
A1  6        5      3/1/2018    4/1/2018    1/1/2015    1234-USF-0075
A1  6        5      3/1/2018    4/1/2018    1/1/2015    1234-USF-0076
A1  6        5      3/1/2018    4/1/2018    1/1/2015    1234-USF-0077
A1  7        6      4/1/2018    5/1/2018    1/1/2015    1234-USF-0075
A1  7        6      4/1/2018    5/1/2018    1/1/2015    1234-USF-0077
A1  7        7      5/1/2018    6/1/2018    1/1/2015    1234-USF-0075
A1  7        7      5/1/2018    6/1/2018    1/1/2015    1234-USF-0077

注释

RadKeys在所有ID/Key对中都是唯一的

Order IDs可以重复相同的ID/Key

1 个答案:

答案 0 :(得分:1)

让我们在分配给两个文件的统一密钥上使用merge创建笛卡尔乘积。

from io import StringIO

radfile = StringIO("""ID/Key  ID  RowKey  RadKey  RadStart    RadStop
 A16    A1    6       4     1/1/2018    2/1/2018
 A16    A1    6       5     3/1/2018    4/1/2018
 A17    A1    7       6     4/1/2018    5/1/2018
 A17    A1    7       7     5/1/2018    6/1/2018""")

manifile = StringIO("""ID/Key  ID   RowKey   Order Date     Order ID
A16     A1     6       1/1/2015   1234-USF-0075
A16     A1     6       1/1/2015   1234-USF-0076
A16     A1     6       1/1/2015   1234-USF-0077
A17     A1     7       1/1/2015   1234-USF-0075
A17     A1     7       1/1/2015   1234-USF-0077""")

rad_df = pd.read_csv(radfile, sep='\s\s+', engine='python')
mani_df = pd.read_csv(manifile, sep='\s\s+', engine='python')

df_out = rad_df.assign(key=1).merge(mani_df.assign(key=1))
df_out.to_csv("outfile.csv", index=False, sep='\t')
!type outfile.csv

输出:

ID/Key  ID  RowKey  RadKey  RadStart    RadStop key Order Date  Order ID
A16 A1  6   4   1/1/2018    2/1/2018    1   1/1/2015    1234-USF-0075
A16 A1  6   4   1/1/2018    2/1/2018    1   1/1/2015    1234-USF-0076
A16 A1  6   4   1/1/2018    2/1/2018    1   1/1/2015    1234-USF-0077
A16 A1  6   5   3/1/2018    4/1/2018    1   1/1/2015    1234-USF-0075
A16 A1  6   5   3/1/2018    4/1/2018    1   1/1/2015    1234-USF-0076
A16 A1  6   5   3/1/2018    4/1/2018    1   1/1/2015    1234-USF-0077
A17 A1  7   6   4/1/2018    5/1/2018    1   1/1/2015    1234-USF-0075
A17 A1  7   6   4/1/2018    5/1/2018    1   1/1/2015    1234-USF-0077
A17 A1  7   7   5/1/2018    6/1/2018    1   1/1/2015    1234-USF-0075
A17 A1  7   7   5/1/2018    6/1/2018    1   1/1/2015    1234-USF-0077