将熊猫数据框的“列表”字符串转换回数据框

时间:2020-07-21 15:25:44

标签: python pandas

我将尝试通过示例DataFrame来说明我的问题:

import pandas as pd
example_df = pd.DataFrame([['a',1,2],['b',3,4],['c',5,6]], columns = ['col1', 'col2', 'col3'])

现在,我将这个数据框转换为类似表格的字符串

from tabulate import tabulate
example_string = tabulate(example_df, headers=list(example_df.columns), tablefmt='jira', showindex="never")

example_string然后看起来像这样...

"|| col1   ||   col2 ||   col3 ||\n| a      |      1 |      2 |\n| b      |      3 |      4 |\n| c      |      5 |      6 |"

所以我的问题是-如何将这个字符串转换回pandas DataFrame?

1 个答案:

答案 0 :(得分:3)

如果将pandasStringIO一起使用,

pd.read_csv可以解析一个字符串。

此处最大的问题是,列标签的分隔符('||')与数据('|')的分隔符不同,并且表周围还有一个附加的'|'。为了解决这个问题,我们将分别读取标头和数据,然后将它们组合成一个DataFrame。 .dropna删除由表格边框'|'创建的边缘上的其他列

import pandas as pd
from io import StringIO

header = (pd.read_csv(StringIO(example_string), sep=r'\|\|', engine='python', 
                      nrows=1, header=None)
             .dropna(how='all', axis=1))
data = (pd.read_csv(StringIO(example_string), sep=r'\|', engine='python', 
                    skiprows=1, header=None)
          .dropna(how='all', axis=1))

# Replace data's RangeIndex with column labels. 
data.columns = data.columns.map(header.T[0].str.strip().to_dict())

print(data)

       col1  col2  col3
0   a           1     2
1   b           3     4
2   c           5     6

上述内容的一个问题是object列仍然具有所有多余的空格。例如,您需要剥离'col1'。数字列已正确键入。这是一个简单的解决方法:

for col in data.select_dtypes('O'):
    data[col] = data[col].str.strip()

print(data)

  col1  col2  col3
0    a     1     2
1    b     3     4
2    c     5     6