일부 기능을 테스트하기 위해 DataFrame
문자열 을 작성하고 싶습니다 . 테스트 데이터가 다음과 같다고 가정 해 보겠습니다.
TESTDATA="""col1;col2;col3
1;4.4;99
2;4.5;200
3;4.7;65
4;3.2;140
"""
해당 데이터를 Pandas로 읽는 가장 간단한 방법은 무엇입니까 DataFrame
?
답변
이를 수행하는 간단한 방법은 StringIO.StringIO
(python2) 또는 io.StringIO
(python3) 을 사용하여 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=";")
답변
분할 방법
data = input_string
df = pd.DataFrame([x.split(';') for x in data.split('\n')])
print(df)
답변
대화식 작업을위한 빠르고 쉬운 솔루션은 클립 보드에서 데이터를로드하여 텍스트를 복사하여 붙여 넣는 것입니다.
마우스로 문자열의 내용을 선택하십시오.
파이썬 셸에서 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
답변
기존 가변 너비 CSV는 데이터를 문자열 변수로 저장하기 위해 읽을 수 없습니다. 특히 .py
파일 내부에서 사용하는 경우 고정 너비의 파이프 분리 데이터를 대신 고려하십시오. 다양한 IDE 및 편집기에는 파이프로 구분 된 텍스트를 깔끔한 테이블로 형식화하는 플러그인이있을 수 있습니다.
사용 read_csv
다음과 같은 유틸리티 모듈에 다음을 저장하십시오 util/pandas.py
. 함수의 docstring에 예제가 포함되어 있습니다.
import io
import re
import pandas as pd
def read_psv(str_input: str, **kwargs) -> pd.DataFrame:
"""Read a Pandas object from a pipe-separated table contained within a string.
Input 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(io.StringIO(str_input), sep='|', **kwargs)
작동하지 않는 대안
아래 코드는 왼쪽과 오른쪽에 빈 열을 추가하기 때문에 제대로 작동하지 않습니다.
df = pd.read_csv(io.StringIO(df_str), sep=r'\s*\|\s*', engine='python')
에 관해서는 read_fwf
, 그것은 실제로 사용하지 않는 옵션 kwargs로의 많은 read_csv
받아 사용합니다. 따라서 파이프로 분리 된 데이터에는 전혀 사용하지 않아야합니다.
답변
가장 간단한 방법은 임시 파일로 저장 한 다음 읽는 것입니다.
import pandas as pd
CSV_FILE_NAME = 'temp_file.csv' # Consider creating temp file, look URL below
with open(CSV_FILE_NAME, 'w') as outfile:
outfile.write(TESTDATA)
df = pd.read_csv(CSV_FILE_NAME, sep=';')
임시 파일을 만드는 올바른 방법 : 파이썬에서 tmp 파일을 어떻게 만들 수 있습니까?