使用Pandas的assign方法将字符串拆分并赋值给两个列

3
如果使用以下DataFrame,我可以拆分“ccy”字符串并创建两个新列:
df_so = pd.DataFrame.from_dict({0: 'gbp_usd',
 1: 'eur_usd',
 2: 'usd_cad',
 3: 'usd_jpy',
 4: 'eur_usd',
 5: 'eur_usd'},orient='index',columns=["ccy"])

df_so[['base_ccy', 'quote_ccy']] = df_so['ccy'].str.split('_', 1, expand=True)

提供以下数据框。

索引 货币 基础货币 报价货币
0 gbp_usd 英镑 美元
1 eur_usd 欧元 美元
2 usd_cad 美元 加元
3 usd_jpy 美元 日元
4 eur_usd 欧元 美元
5 eur_usd 欧元 美元
我如何在下面的调整函数中使用DataFrame.assign执行相同的str.split
我可以使用列表推导式来获得相同的结果,但是否有更简单/更清晰的方法使用assign?
def tweak_df (df_):
  return (df_.assign(base_currency= lambda df_: [i[0] for i in df_['ccy'].str.split('_', 1)],
                     quote_currency= lambda df_: [i[1] for i in df_['ccy'].str.split('_', 1)],
                     )        
  )
tweak_df(df_so)

与上表相同,但代码不够直观简单。简单胜于复杂。
2个回答

2
一种可能的解决方案:
df_so.assign(**tweak_df(df_so))

输出:

       ccy base_ccy quote_ccy base_currency quote_currency
0  gbp_usd      gbp       usd           gbp            usd
1  eur_usd      eur       usd           eur            usd
2  usd_cad      usd       cad           usd            cad
3  usd_jpy      usd       jpy           usd            jpy
4  eur_usd      eur       usd           eur            usd
5  eur_usd      eur       usd           eur            usd

请问您可以分享您代码的其余部分吗? - nipy
1
我猜那已经不再必要了,因为其他人已经给你提供了一个解决方案,而你也接受了,@nipy。祝一切顺利! - PaulS

1
我认为你建议的第一个版本是最好的。
df_so[['base_ccy', 'quote_ccy']] = df_so['ccy'].str.split('_', 1, expand=True)

如果您想使用assign完成此操作,可以使用rename函数来实现。
df_so.assign(**df_so['ccy'].str.split('_', n=1, expand=True)
             .rename(columns={0: "base_ccy", 1: "quote_ccy"}))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接