我使用pandas 0.18。我有一个如下所示的数据框:
>> df = pd.DataFrame({'ods': {0: 'A86016', 1: 'L81042', 2: 'C84013', 3: 'G82228', 4: 'C81083'},
'id': {0: np.nan, 1: 463061.0, 2: np.nan, 3: 462941.0, 4: np.nan},
'provider': {0: 'emis', 1: np.nan, 2: 'tpp', 3: 'emis', 4: 'tpp'}})
>> print df
id ods provider
0 NaN A86016 emis
1 463061.0 L81042 NaN
2 NaN C84013 tpp
3 462941.0 G82228 emis
4 NaN C81083 tp
我想输出一个格式如下的表:
id (ods) provider
1 (A86016) emis
2 (L81042) NaN
3 (C84013) tpp
有没有一种简单的方法可以在不创建新列的情况下使用pandas执行此操作?我知道我可以这样做:
df['newcol'] = df.id.str + " (" + df.ods.str + ")"
print df[['newcol', 'provider']]
但我只是想知道我是否可以跳过创建新列的中间步骤。
答案 0 :(得分:0)
一种可能的解决方案是从DataFrame
创建新的Series
- 其中一个是标记列id
和ods
,另一个是列provider
:
print pd.DataFrame({'id (ods)': df.id.astype(str) + "(" + df.ods + ")",
'provider': df.provider})
id (ods) provider
0 nan (A86016) emis
1 463061.0 (L81042) NaN
2 nan (C84013) tpp
3 462941.0 (G82228) emis
4 nan (C81083) tpp
答案 1 :(得分:0)
您可以尝试这样做:
df = df.assign(id_obs=df['id'].astype(str) + ' (' + df['ods'] + ')').drop(['id','ods'], axis=1)
10K DF的时间安排:
In [132]: %timeit pd.DataFrame({'id (ods)':df.id.astype(str) + " (" + df.ods + ")", 'provider': df.provider})
1 loop, best of 3: 734 ms per loop
In [133]: %timeit df.assign(id_obs=df['id'].astype(str) + ' (' + df['ods'] + ')').drop(['id','ods'], axis=1)
1 loop, best of 3: 758 ms per loop