在熊猫数据帧中合并两列文本

2022-09-05 01:21:12

我在Python中有一个使用pandas的20 x 4000数据帧。其中两列被命名为 和 。我想创建一个名为 make 和 into 的变量。YearquarterperiodYear = 2000quarter= q22000q2

任何人都可以帮忙吗?


答案 1

如果两列都是字符串,则可以直接连接它们:

df["period"] = df["Year"] + df["quarter"]

如果一列(或两列)不是字符串类型化的,则应首先将其(它们)转换为字符串,

df["period"] = df["Year"].astype(str) + df["quarter"]

执行此操作时要小心 NaN!


如果需要联接多个字符串列,可以使用 :agg

df['period'] = df[['Year', 'quarter', ...]].agg('-'.join, axis=1)

其中“-”是分隔符。


答案 2

小型数据集(< 150 行)

[''.join(i) for i in zip(df["Year"].map(str),df["quarter"])]

或稍慢但更紧凑:

df.Year.str.cat(df.quarter)

更大的数据集(> 150rows)

df['Year'].astype(str) + df['quarter']

更新:时序图熊猫 0.23.4

enter image description here

让我们在 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 的回答贡献