从字符串创建熊猫数据帧从字符串创建熊猫数据帧(Create Pandas DataFrame fro

2019-05-09 02:20发布

为了测试一些功能我想创建一个DataFrame从一个字符串。 比方说,我的测试数据是这样的:

TESTDATA="""col1;col2;col3
1;4.4;99
2;4.5;200
3;4.7;65
4;3.2;140
"""

什么是读取数据到大熊猫的最简单方法DataFrame

Answer 1:

一个简单的方法来做到这一点是使用StringIO并传递到pandas.read_csv功能。 例如:

import sys
if sys.version_info[0] < 3: 
    from StringIO import StringIO
else:
    from io import StringIO

import pandas as pd

TESTDATA = StringIO("""col1;col2;col3
    1;4.4;99
    2;4.5;200
    3;4.7;65
    4;3.2;140
    """)

df = pd.read_csv(TESTDATA, sep=";")


Answer 2:

传统的可变宽度CSV是不可读用于存储数据作为一个字符串变量。 特别是对于内部使用.py文件,考虑固定宽度管分隔的数据来代替。 各种IDE和编辑可以具有一个插件来管分隔文本格式化成一个整洁的表。

以下为我工作。 要使用它,它保存到一个文件,如pandas_util.py 。 包括一个示例,在函数的文档字符串。 如果您使用的是Python版本早于3.6,删除函数定义行的类型注释。

import re

import pandas as pd


def read_pipe_separated_str(str_input: str, **kwargs) -> pd.DataFrame:
    """Read a Pandas object from a pipe-separated table contained within a string.

    Example:
        | int_score | ext_score | eligible |
        |           | 701       | True     |
        | 221.3     | 0         | False    |
        |           | 576       | True     |
        | 300       | 600       | True     |

    The leading and trailing pipes are optional, but if one is present, so must be the other.

    `kwargs` are passed to `read_csv`. They must not include `sep`.

    In PyCharm, the "Pipe Table Formatter" plugin has a "Format" feature that can be used to neatly format a table.
    """
    # Ref: https://stackoverflow.com/a/46471952/
    substitutions = [
        ('^ *', ''),  # Remove leading spaces
        (' *$', ''),  # Remove trailing spaces
        (r' *\| *', '|'),  # Remove spaces between columns
    ]
    if all(line.lstrip().startswith('|') and line.rstrip().endswith('|') for line in str_input.strip().split('\n')):
        substitutions.extend([
            (r'^\|', ''),  # Remove redundant leading delimiter
            (r'\|$', ''),  # Remove redundant trailing delimiter
        ])
    for pattern, replacement in substitutions:
        str_input = re.sub(pattern, replacement, str_input, flags=re.MULTILINE)
    return pd.read_csv(pd.compat.StringIO(str_input), sep='|', **kwargs)

非工作的选择:

下面的代码,因为它在左,右两侧增加了一个空列不能正常工作。

df = pd.read_csv(pd.compat.StringIO(df_str), sep=r'\s*\|\s*', engine='python')


Answer 3:

互动工作一个快速简便的解决办法是复制和粘贴从剪贴板加载数据的文本。

用鼠标选中该字符串的内容:

在Python壳使用read_clipboard()

>>> pd.read_clipboard()
  col1;col2;col3
0       1;4.4;99
1      2;4.5;200
2       3;4.7;65
3      4;3.2;140

使用适当的分隔符:

>>> pd.read_clipboard(sep=';')
   col1  col2  col3
0     1   4.4    99
1     2   4.5   200
2     3   4.7    65
3     4   3.2   140

>>> df = pd.read_clipboard(sep=';') # save to dataframe


Answer 4:

拆分方法

data = input_string
df = pd.DataFrame([x.split(';') for x in data.split('\n')])
print(df)


文章来源: Create Pandas DataFrame from a string