我有一个20 x 4000的数据帧在Python中使用熊猫。其中两列分别命名为Year和quarter。我想创建一个名为period的变量,使Year = 2000, quarter= q2变为2000q2。

有人能帮忙吗?


当前回答

可以使用DataFrame的assign方法:

df= (pd.DataFrame({'Year': ['2014', '2015'], 'quarter': ['q1', 'q2']}).
  assign(period=lambda x: x.Year+x.quarter ))

其他回答

该解决方案使用中间步骤,将DataFrame的两列压缩为包含值列表的单列。 这不仅适用于字符串,而且适用于所有类型的列-dtype

import pandas as pd
df = pd.DataFrame({'Year': ['2014', '2015'], 'quarter': ['q1', 'q2']})
df['list']=df[['Year','quarter']].values.tolist()
df['period']=df['list'].apply(''.join)
print(df)

结果:

   Year quarter        list  period
0  2014      q1  [2014, q1]  2014q1
1  2015      q2  [2015, q2]  2015q2

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

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)

其中“-”是分隔符。

df = pd.DataFrame({'Year': ['2014', '2015'], 'quarter': ['q1', 'q2']})
df['period'] = df[['Year', 'quarter']].apply(lambda x: ''.join(x), axis=1)

产生这个数据框架

   Year quarter  period
0  2014      q1  2014q1
1  2015      q2  2015q2

该方法通过将df[['Year', 'quarter']]替换为数据帧的任意列片来泛化任意数量的字符串列,例如df.iloc[:,0:2]。Apply (lambda x: " .join(x), axis=1)。

您可以在这里查看有关apply()方法的更多信息

泛化到多个列,为什么不呢:

columns = ['whatever', 'columns', 'you', 'choose']
df['period'] = df[columns].astype(str).sum(axis=1)

当使用加法运算符+将列与字符串连接起来时,如果其中任何一个是NaN,则整个输出将是NaN,因此使用fillna()

df["join"] = "some" + df["col"].fillna(df["val_if_nan"])