एक स्ट्रिंग से पंडों DataFrame बनाएँ


276

कुछ कार्यक्षमता का परीक्षण करने के लिए मैं DataFrameएक स्ट्रिंग से बनाना चाहूंगा । मान लें कि मेरा परीक्षण डेटा निम्न प्रकार है:

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

पंडों में उस डेटा को पढ़ने का सबसे सरल तरीका क्या है DataFrame?

जवाबों:


497

यह करने के लिए एक आसान तरीका उपयोग करने के लिए है 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=";")

7
Iff आपको ऐसा कोड चाहिए जो Python 2 और 3 दोनों के साथ संगत हो, आप वैकल्पिक रूप से भी उपयोग कर सकते हैं from pandas.compat import StringIO, यह देखते हुए कि यह वही वर्ग है जो Python के साथ आता है।
एक्यूमेनस

3
FYI करें - pd.read_table()एक समान कार्य है, बस थोड़ा बेहतर नामकरण df = pd.read_table(TESTDATA, sep=";"):।
wkzhu

5
@AntonvBR ने ध्यान दिया कि कोई भी उपयोग कर सकता है pandas.compat.StringIO। इस तरह हमें StringIOअलग से आयात नहीं करना है । हालाँकि pandas.compatपैकेज को pandas.pydata.org/pandas-docs/stable/api.html?highlight=compat के अनुसार निजी माना जाता है, इसलिए उत्तर को छोड़ना अभी के लिए है।
एमिल एच


यदि आप के साथ TESTDATA बनाते हैं df.to_csv(TESTDATA), तो उपयोग करेंTESTDATA.seek(0)
user3226167

18

विभाजन विधि

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

2
यदि आप कॉलम नामों के लिए पहली पंक्ति का उपयोग करना चाहते हैं, तो दूसरी पंक्ति को इस में बदलें:df = pd.DataFrame([x.split(';') for x in data.split('\n')[1:]], columns=[x for x in data.split('\n')[0].split(';')])
मैबिन

1
यह गलत है, क्योंकि CSV फ़ाइलों पर newline (\ n) वर्ण किसी फ़ील्ड का हिस्सा हो सकता है।
एंटोनियो एरकोले डी लुका

यह बहुत मजबूत नहीं है, और अधिकांश लोग स्वीकृत उत्तर के साथ बेहतर होंगे। चीजों की एक बहुत ही आंशिक सूची है जो इसके साथ गलत हो सकती है thomasburette.com/blog/2014/05/25/…
DanB

10

इंटरेक्टिव काम के लिए एक त्वरित और आसान समाधान क्लिपबोर्ड से डेटा लोड करके पाठ को कॉपी और पेस्ट करना है।

अपने माउस से स्ट्रिंग की सामग्री का चयन करें:

पंडों के डेटाफ्रेम में चिपकाने के लिए डेटा की प्रतिलिपि बनाएँ

पायथन शेल के उपयोग में 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

2
प्रतिलिपि प्रस्तुत करने योग्यता के लिए अच्छा नहीं है, लेकिन अन्यथा एक बहुत साफ समाधान!
मैबिन

5

स्ट्रिंग चर के रूप में डेटा संग्रहीत करने के लिए एक पारंपरिक चर-चौड़ाई CSV अपठनीय है। विशेष रूप से एक .pyफ़ाइल के अंदर उपयोग के लिए , इसके बजाय निश्चित-चौड़ाई वाले पाइप-पृथक डेटा पर विचार करें। विभिन्न आईडीई और संपादकों में पाइप-अलग पाठ को एक साफ तालिका में प्रारूपित करने के लिए एक प्लगइन हो सकता है।

का उपयोग करते हुए read_csv

एक उपयोगिता मॉड्यूल में निम्न स्टोर करें, जैसे util/pandas.py। एक उदाहरण फ़ंक्शन के डॉकस्ट्रिंग में शामिल है।

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स्वीकार करता है और उपयोग करता है के कई का उपयोग नहीं करता है। जैसे, इसे पाइप से अलग किए गए डेटा के लिए बिल्कुल भी उपयोग नहीं किया जाना चाहिए।


1
मैंने पाया (ट्रायल एंड एरर) जो कि दस्तावेज़ों की तुलना में अधिक तर्क read_fwfलेता read_csvहै, लेकिन यह सच है कि कुछ का कोई प्रभाव नहीं है
गेरिट

-4

सबसे आसान तरीका यह है कि आप इसे टेम्प फाइल में सेव करें और फिर इसे पढ़ें:

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 फ़ाइल कैसे बना सकता हूँ?


यदि फ़ाइल बनाने की अनुमति नहीं है तो क्या होगा?
बिंगली २२४

मेरी राय में यह अब तक का सबसे सरल मामला नहीं है। ध्यान दें कि "सरलतम" प्रश्न में स्पष्ट रूप से कहा गया है।
QtRoS
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.