【问题标题】:Pandas DataFrame efficiently split one column into multiplePandas DataFrame 有效地将一列拆分为多列
【发布时间】:2021-02-26 16:28:48
【问题描述】:

我有一个类似这样的数据框:

data = {"col_1": [0, 1, 2],
        "col_2": ["abc", "defg", "hi"]}
df = pd.DataFrame(data)

视觉上:

   col_1 col_2
0      0   abc
1      1   defg
2      2   hi

我想做的是拆分 col_2 中的每个字符,并将其作为新列添加到数据框

示例迭代方法:

def get_chars(string):
    chars = []
    for char in string:
        chars.append(char)
    return chars

char_df = pd.DataFrame()
for i in range(len(df)):
    char_arr = get_chars(df.loc[i, "col_2"])
    temp_df = pd.DataFrame(char_arr).T
    char_df = pd.concat([char_df, temp_df], ignore_index=True, axis=0)

df = pd.concat([df, char_df], ignore_index=True, axis=1)

结果是正确的形式:

   0     1  2  3    4    5
0  0   abc  a  b    c  NaN
1  1  defg  d  e    f    g
2  2    hi  h  i  NaN  NaN

但我认为像这样迭代数据帧效率非常低,所以我想找到一个更快(理想的矢量化)解决方案。

实际上,我并没有真正拆分字符串,但这个问题的重点是找到一种方法来有效地处理一列并返回许多列。

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

如果需要性能,请使用 DataFrame 构造函数并将值转换为列表:

df = df.join(pd.DataFrame([list(x) for x in df['col_2']], index=df.index))

或者:

df = df.join(pd.DataFrame(df['col_2'].apply(list).tolist(), index=df.index))

print (df)
   col_1 col_2  0  1     2     3
0      0   abc  a  b     c  None
1      1  defg  d  e     f     g
2      2    hi  h  i  None  None

【讨论】:

  • 太好了,谢谢。实际上 col_2 将列表作为字符串保存:[1.0023, 3.0421, ...],所以我只需在您的第一个解决方案中将 list 更改为 eval
  • @RoryLM - 或者使用 ast.literal_eval(x) 代替 eval - link
猜你喜欢
  • 2016-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
  • 2022-12-29
  • 1970-01-01
  • 2019-05-18
  • 2022-01-03
相关资源
最近更新 更多