Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 转换为';制表';数据帧的字符串返回到数据帧中_Python_Pandas - Fatal编程技术网

Python 转换为';制表';数据帧的字符串返回到数据帧中

Python 转换为';制表';数据帧的字符串返回到数据帧中,python,pandas,Python,Pandas,我将尝试用一个示例数据帧来说明我的问题: 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

我将尝试用一个示例数据帧来说明我的问题:

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")
示例\u字符串如下所示

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

所以我的问题是-如何将此字符串转换回pandas数据帧?

pandas
如果将
StringIO
pd.read\u csv
一起使用,则可以解析字符串

这里最大的问题是,列标签的分隔符(
“| |”
)与数据(
“|”
)不同,表的周围还有一个额外的“
。为了解决这个问题,我们将分别读取报头和数据,然后将它们组合成一个数据帧。
.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())

上面提到的一个问题是
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

谢谢你的帮助,我成功地将这个例子应用到我的工作中。将StringIO与read_csv结合使用才是真正的关键!
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