Reputation: 55
I have two DataFrames, one have all data to be repeated to create a new DataFrame but each time it is repeated, a column has to change its values using the letter from another DataFrame:
DF1
t1 t2 t3 t4
0 ABC 0 A 1950
1 CDE 1 A 1950
and
DF2
[P,Q,R]
I want to get:
DF0
t1 t2 t3 t4
0 ABC 0 A 1950-P
1 CDE 1 A 1950-P
2 XYZ 1 B 1954-Q
3 123 1 C 1954-Q
4 ABC 0 A 1950-R
5 CDE 1 A 1950-R
I have tried :
TMP = pd.DataFrame()
DF0 = pd.DataFrame()
TMP = DF1['t4']
DF1['t4'] = TMP + ' ' + DF2[0]
DF0 = DF0.append(DF1)
TMP = DF1['t4']
DF1['t4'] = TMP + ' ' + DF2[0]
DF0 = DF0.append(DF1)
but P is still in the second iteration and third, something like this:
1 CDE 1 A 1950-P
2 XYZ 1 B 1954-P-Q
Upvotes: 1
Views: 35
Reputation: 862511
Use cross join with DataFrame.explode
(pandas 0.25+) for repat lists values:
df2 = pd.DataFrame({'col':[['P','Q','R']]})
print (df2)
col
0 [P, Q, R]
df2 = df2.explode('col')
print (df2)
col
0 P
0 Q
0 R
df = df1.assign(a=1).merge(df2.assign(a=1), on='a')
df['t4'] = df['t4'].astype(str) + '-' + df['col']
print (df)
t1 t2 t3 t4 a col
0 ABC 0 A 1950-P 1 P
1 ABC 0 A 1950-Q 1 Q
2 ABC 0 A 1950-R 1 R
3 CDE 1 A 1950-P 1 P
4 CDE 1 A 1950-Q 1 Q
5 CDE 1 A 1950-R 1 R
Upvotes: 1