在熊猫数据帧中合并两列文本
我在Python中有一个使用pandas的20 x 4000数据帧。其中两列被命名为 和 。我想创建一个名为 make 和 into 的变量。Year
quarter
period
Year = 2000
quarter= q2
2000q2
任何人都可以帮忙吗?
我在Python中有一个使用pandas的20 x 4000数据帧。其中两列被命名为 和 。我想创建一个名为 make 和 into 的变量。Year
quarter
period
Year = 2000
quarter= q2
2000q2
任何人都可以帮忙吗?
如果两列都是字符串,则可以直接连接它们:
df["period"] = df["Year"] + df["quarter"]
如果一列(或两列)不是字符串类型化的,则应首先将其(它们)转换为字符串,
df["period"] = df["Year"].astype(str) + df["quarter"]
如果需要联接多个字符串列,可以使用 :agg
df['period'] = df[['Year', 'quarter', ...]].agg('-'.join, axis=1)
其中“-”是分隔符。
[''.join(i) for i in zip(df["Year"].map(str),df["quarter"])]
或稍慢但更紧凑:
df.Year.str.cat(df.quarter)
df['Year'].astype(str) + df['quarter']
更新:时序图熊猫 0.23.4
让我们在 200K 行 DF 上测试它:
In [250]: df
Out[250]:
Year quarter
0 2014 q1
1 2015 q2
In [251]: df = pd.concat([df] * 10**5)
In [252]: df.shape
Out[252]: (200000, 2)
更新:使用熊猫0.19.0的新时间
没有 CPU/GPU 优化的计时(按从最快到最慢的顺序排序):
In [107]: %timeit df['Year'].astype(str) + df['quarter']
10 loops, best of 3: 131 ms per loop
In [106]: %timeit df['Year'].map(str) + df['quarter']
10 loops, best of 3: 161 ms per loop
In [108]: %timeit df.Year.str.cat(df.quarter)
10 loops, best of 3: 189 ms per loop
In [109]: %timeit df.loc[:, ['Year','quarter']].astype(str).sum(axis=1)
1 loop, best of 3: 567 ms per loop
In [110]: %timeit df[['Year','quarter']].astype(str).sum(axis=1)
1 loop, best of 3: 584 ms per loop
In [111]: %timeit df[['Year','quarter']].apply(lambda x : '{}{}'.format(x[0],x[1]), axis=1)
1 loop, best of 3: 24.7 s per loop
使用 CPU/GPU 优化的计时:
In [113]: %timeit df['Year'].astype(str) + df['quarter']
10 loops, best of 3: 53.3 ms per loop
In [114]: %timeit df['Year'].map(str) + df['quarter']
10 loops, best of 3: 65.5 ms per loop
In [115]: %timeit df.Year.str.cat(df.quarter)
10 loops, best of 3: 79.9 ms per loop
In [116]: %timeit df.loc[:, ['Year','quarter']].astype(str).sum(axis=1)
1 loop, best of 3: 230 ms per loop
In [117]: %timeit df[['Year','quarter']].astype(str).sum(axis=1)
1 loop, best of 3: 230 ms per loop
In [118]: %timeit df[['Year','quarter']].apply(lambda x : '{}{}'.format(x[0],x[1]), axis=1)
1 loop, best of 3: 9.38 s per loop
@anton-vbr 的回答贡献