我有一个非常大的数据框架,有100,000行和300列
我试图通过从其他列中提取值来填充一列中的Nan行
就是这个例子,
假设我们有一个示例数据框架,如:
NAME RRN_FRONT RRN_BACK EVENT_DTL
1 JOHN 891105 1067714 Nan
2 SHOWN 791134 1156543 Nan
3 BROWN 581104 1668314 Nan
4 MIKE 984564 0153422 1. Name : MIKE
2. BIRTHDAY : 984564
3. SSN : 0153422
5 LARRY 796515 0168165 1. Name : LARRY
2. BIRTHDAY : 796515
3. SSN : 0168165
,我想用NAME, RRN_FRONT, RRN_BACK
填充Nan值下面是我尝试的输入:
df.loc[df.EVENT_DTL.isnull(), 'EVENT_DTL'] = df.apply(lambda x: ('1. NAME : ' + str(x['NAME']) + 'n2. BIRTHDAY : ' + str(x['RRN_FRONT']) + 'n3. SSN : ' + str(x['RRN_BACK']),axis=1)
,输出是(这不是我想要的):
1. NAME : JOHN2. nBIRTHDAY : 8911053. nSSN : 1067714
2. ...
.
.
5. ...
下面是df['EVENT_DTL']
的期望输出:
1 1. NAME : JOHN
2. BIRTHDAY : 8911053
3. SSN : 1156543
2 1. NAME : SHOWN
2. BIRTHDAY : 791134
3. SSN : 1156543
3 ‥
4 ‥
5 ‥
不适用的解决方案:
df = pd.DataFrame({'col1': ['JOHN', 'SHOWN', 'BROWN'], 'col2': [10, 20, 30], 'col3': [None, None, 'other text']})
idx = df.col3.isna()
df.loc[idx, 'col3'] = ('1. Name:' + df.loc[idx, 'col1'] + 'n2. BIRTHDAY:' + df.loc[idx, 'col2'].astype('str')).str.split('n')
df = df.explode('col3')
df = df.set_index([df.index+1, df.groupby(level=0).cumcount()+1])['col3']
print(df)
1 1 1. Name:JOHN
2 2. BIRTHDAY:10
2 1 1. Name:SHOWN
2 2. BIRTHDAY:20
3 1 other text
Name: col3, dtype: object
熊猫。apply默认应用axis=0
(索引轴)上的操作,您需要在您的情况下更改axis=1
:
df['EVENT_DTL'] = (np.where(df['EVENT_DTL'].isna(),
df.apply(lambda x: ('1. NAME :n' + str(x['NAME']) +
'2. BIRTHDAY :n' + str(x['RRN_FRONT']) + '3. SSN : n' +
str(x['RRN_BACK'])), axis=1),
df['EVENT_DTL']))
输出:
0 1. NAME :nJOHN2. BIRTHDAY :n8911053. SSN : ...
1 1. NAME :nSHOWN2. BIRTHDAY :n7911343. SSN : ...
2 1. NAME :nBROWN2. BIRTHDAY :n5811043. SSN : ...
3 1. Name : MIKE 2. BIRTHDAY : 984564 3. SSN : 0...
4 1. Name : LARRY 2. BIRTHDAY : 796515 3. SSN : ...
Name: EVENT_DTL, dtype: object