【问题标题】:delimit/split row values and form individual rows分隔/拆分行值并形成单独的行
【发布时间】:2018-11-24 06:27:46
【问题描述】:

数据的可重现代码:

import pandas as pd
dict = {"a": "[1,2,3,4]", "b": "[1,2,3,4]"}
dict = pd.DataFrame(list(dict.items()))

dict

    0   1
 0  a   [1,2,3,4]
 1  b   [1,2,3,4]

我想拆分/分隔“第 1 列”并为每个拆分值创建单独的行。

预期输出:

     0    1
  0  a    1
  1  a    2
  2  a    3
  3  a    4
  4  b    1
  5  b    2
  6  b    3
  7  b    4

我应该先删除括号然后拆分值吗?我真的不知道这样做。请问有什么参考资料可以帮助我解决这个问题吗?

【问题讨论】:

标签: python delimiter reshape


【解决方案1】:

因为您的单元格中有包含列表(而不是列表)的字符串,您可以使用eval:

dict_v = {"a": "[1,2,3,4]", "b": "[1,2,3,4]"}
df = pd.DataFrame(list(dict_v.items()))
df = (df.rename(columns={0:'l'}).set_index('l')[1]
          .apply(lambda x: pd.Series(eval(x))).stack()
           .reset_index().drop('level_1',1).rename(columns={'l':0,0:1}))

或者另一种方法是创建一个DataFrame(可能更快),例如:

df = (pd.DataFrame(df[1].apply(eval).tolist(),index=df[0])
          .stack().reset_index(level=1, drop=True)
            .reset_index(name='1'))

你的输出是

   0  1
0  a  1
1  a  2
2  a  3
3  a  4
4  b  1
5  b  2
6  b  3
7  b  4

所有重命名都是为了准确获取您的输入/输出

【讨论】:

    【解决方案2】:

    基于that answer的逻辑:

    s = d[1]\
        .apply(lambda x: pd.Series(eval(x)))\
        .stack()
    
    s.index = s.index.droplevel(-1)
    s.name = "split"
    d.join(s).drop(1, axis=1)
    

    【讨论】:

    • 感谢 Kopytok,此解决方案也有效。我觉得另一个更容易理解和解释。再次感谢您的解决方案:)
    猜你喜欢
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多