假设我有一个看起来像这样的数据框:
REFERENCE_CODE DUMMY_DATA
dog foo
cat fi
fish fo
bird fum
1 u
2 v
3 x
4 y
我的目标是创建一个数据框,该数据框将变为:
REFERENCE_CODE DUMMY_DATA
dog foo
cat fi
fish fo
bird fum
dog_1 u
dog_2 v
dog_3 x
dog_4 y
cat_1 u
cat_2 v
cat_3 x
cat_4 y
fish_1 u
fish_2 v
fish_3 x
fish_4 y
bird_1 u
bird_2 v
bird_3 x
bird_4 y
我能够到达:
REFERENCE_CODE DUMMY_DATA
dog foo
cat fi
fish fo
bird fum
bird_1 u
bird_2 v
bird_3 x
bird_4 y
通过使用以下代码:
df.REFERENCE_CODE = df.REFERENCE_CODE.fillna('')
df['REFERENCE_CODE'] = df['REFERENCE_CODE'].apply(lambda x: str(x))
headers = (df.REFERENCE_CODE != '') & ~df['REFERENCE_CODE'].fillna('').str.isnumeric()
res = df.groupby(headers.cumsum())['REFERENCE_CODE'].apply(lambda x: x.iloc[0] + '_' + x)
df.REFERENCE_CODE.update(res[df.REFERENCE_CODE.str.isnumeric()])
如何使它应用于所有其他列并扩展数据框,而又不丢失其他列的完整性。
答案 0 :(得分:0)
想法是对过滤后的非数字REFERENCE_CODE
列和过滤后的具有数值行的列使用交叉连接:
#simplify code
df['REFERENCE_CODE'] = df.REFERENCE_CODE.fillna('').astype(str)
mask = (df.REFERENCE_CODE != '') & ~df['REFERENCE_CODE'].str.isnumeric()
#filter by condition for matched and not matched rows
df1 = df[mask]
df2 = df[~mask]
#cross join
df = df1[['REFERENCE_CODE']].assign(A=1).merge(df2.assign(A=1), on='A')
#join columns together
df['REFERENCE_CODE'] = df['REFERENCE_CODE_x'] + '_' + df['REFERENCE_CODE_y']
#concat new DataFrame with first filtered
df = pd.concat([df1, df[['REFERENCE_CODE','DUMMY_DATA']]], ignore_index=True)
print (df)
REFERENCE_CODE DUMMY_DATA
0 dog foo
1 cat fi
2 fish fo
3 bird fum
4 dog_1 u
5 dog_2 v
6 dog_3 x
7 dog_4 y
8 cat_1 u
9 cat_2 v
10 cat_3 x
11 cat_4 y
12 fish_1 u
13 fish_2 v
14 fish_3 x
15 fish_4 y
16 bird_1 u
17 bird_2 v
18 bird_3 x
19 bird_4 y
答案 1 :(得分:0)
您可以首先将数据帧切成必要的值以生成输出的扩展部分:
m = 4
codes = df.REFERENCE_CODE.iloc[:m]
dum = df.DUMMY_DATA.iloc[m:].values
按列表理解顺序使用字符串格式来生成一个列表,其中包含REFERENCE_CODE
中的新值:
x = [[f'{i+1}_{j}', dum[i]] for j in codes for i in range(m)]
new = pd.DataFrame(x, columns=df.columns)
然后将新数据框.append
用于df
:
df.iloc[:m].append(new)
REFERENCE_CODE DUMMY_DATA
0 dog foo
1 cat fi
2 fish fo
3 bird fum
4 1_dog u
5 2_dog v
6 3_dog x
7 4_dog y
8 1_cat u
9 2_cat v
10 3_cat x
11 4_cat y
12 1_fish u
13 2_fish v
14 3_fish x
15 4_fish y
16 1_bird u
17 2_bird v
18 3_bird x
19 4_bird y