पंडों का प्रदर्शन कैसे करें स्तंभों के लिए एक प्रारूप स्ट्रिंग का उपयोग करके फ़्लोट्स का डेटाफ़्रेम?


166

मैं एक दिए गए प्रारूप print()और IPython के साथ एक पांडा डेटाफ्रेम प्रदर्शित करना चाहूंगा display()। उदाहरण के लिए:

df = pd.DataFrame([123.4567, 234.5678, 345.6789, 456.7890],
                  index=['foo','bar','baz','quux'],
                  columns=['cost'])
print df

         cost
foo   123.4567
bar   234.5678
baz   345.6789
quux  456.7890

मैं किसी भी तरह से छपाई में इसका इस्तेमाल करना चाहूंगा

         cost
foo   $123.46
bar   $234.57
baz   $345.68
quux  $456.79

डेटा को स्वयं संशोधित करने या प्रतिलिपि बनाने के बिना, बस इसे प्रदर्शित करने के तरीके को बदलें।

मैं यह कैसे कर सकता हूँ?


2
क्या costएकमात्र फ्लोट कॉलम है, या क्या अन्य फ्लोट कॉलम हैं जिन्हें फॉर्मेट नहीं किया जाना चाहिए $?
unutbu

मैं इसे केवल कॉस्ट कॉलम के लिए करना चाहता हूं (मेरे वास्तविक डेटा में अन्य कॉलम हैं)
जेसन एस

मुझे पता है कि एक बार $ संलग्न होने पर, डेटा प्रकार स्वचालित रूप से ऑब्जेक्ट में बदल जाता है।
नगुइ अल

जवाबों:


284
import pandas as pd
pd.options.display.float_format = '${:,.2f}'.format
df = pd.DataFrame([123.4567, 234.5678, 345.6789, 456.7890],
                  index=['foo','bar','baz','quux'],
                  columns=['cost'])
print(df)

पैदावार

        cost
foo  $123.46
bar  $234.57
baz  $345.68
quux $456.79

लेकिन यह केवल तभी काम करता है जब आप चाहते हैं कि प्रत्येक फ्लोट एक डॉलर चिह्न के साथ स्वरूपित किया जाए।

अन्यथा, यदि आप केवल कुछ फ़्लोट्स के लिए डॉलर फ़ॉर्मेटिंग चाहते हैं, तो मुझे लगता है कि आपको डेटाफ़्रेम (उन फ़्लोट्स को स्ट्रिंग्स में कनवर्ट करना) को पूर्व-संशोधित करना होगा:

import pandas as pd
df = pd.DataFrame([123.4567, 234.5678, 345.6789, 456.7890],
                  index=['foo','bar','baz','quux'],
                  columns=['cost'])
df['foo'] = df['cost']
df['cost'] = df['cost'].map('${:,.2f}'.format)
print(df)

पैदावार

         cost       foo
foo   $123.46  123.4567
bar   $234.57  234.5678
baz   $345.68  345.6789
quux  $456.79  456.7890

3
यह समाधान अभी भी मेरे लिए पांडा 0.22 के रूप में ठीक से काम करता है।
टेलर एड्मिस्टन

19
जैसा कि यहां दिखाया गया है , आप केवल दिए गए ब्लॉक के लिए विकल्पों को संशोधित करके उपयोग कर सकते हैंwith pd.option_context('display.float_format', '${:,.2f}'.format'):
आंद्रे होल्जनर

1
'@AndreHolzner की टिप्पणी पर समापन कोष्ठक से पहले अतिरिक्त ; अन्यथा, यह एक आकर्षण की तरह काम करता है!
dTanMan

67

यदि आप डेटाफ़्रेम को संशोधित नहीं करना चाहते हैं, तो आप उस कॉलम के लिए कस्टम फ़ॉर्मेटर का उपयोग कर सकते हैं।

import pandas as pd
pd.options.display.float_format = '${:,.2f}'.format
df = pd.DataFrame([123.4567, 234.5678, 345.6789, 456.7890],
                  index=['foo','bar','baz','quux'],
                  columns=['cost'])


print df.to_string(formatters={'cost':'${:,.2f}'.format})

पैदावार

        cost
foo  $123.46
bar  $234.57
baz  $345.68
quux $456.79

2
क्या मल्टीलेवल कॉलम पर काम करने के लिए फॉर्मेटर प्राप्त करना संभव है?
user2579685

3
AFAICT, यह उदाहरण दूसरी पंक्ति के बिना काम करता हैpd.options.display.float_format = '${:,.2f}'.format
पियानोजैम

56

पंडों 0.17 के रूप में अब एक स्टाइलिंग प्रणाली है जो अनिवार्य रूप से पायथन प्रारूप प्रारूपण का उपयोग करके डेटाफ़्रेम के स्वरूपित विचार प्रदान करती है :

import pandas as pd
import numpy as np

constants = pd.DataFrame([('pi',np.pi),('e',np.e)],
                   columns=['name','value'])
C = constants.style.format({'name': '~~ {} ~~', 'value':'--> {:15.10f} <--'})
C

जो प्रदर्शित करता है

यहां छवि विवरण दर्ज करें

यह एक दृश्य वस्तु है; डेटाफ़्रेम स्वयं स्वरूपण नहीं बदलता है, लेकिन डेटाफ़्रेम में अपडेट दृश्य में परिलक्षित होते हैं:

constants.name = ['pie','eek']
C

यहां छवि विवरण दर्ज करें

हालाँकि इसकी कुछ सीमाएँ हैं:

  • नई पंक्तियों और / या स्तंभों को जोड़ने से स्टाइल दृश्य में असंगति पैदा होती है (पंक्ति / स्तंभ लेबल नहीं जोड़ता है):

    constants.loc[2] = dict(name='bogus', value=123.456)
    constants['comment'] = ['fee','fie','fo']
    constants

यहां छवि विवरण दर्ज करें

जो ठीक लगता है लेकिन:

C

यहां छवि विवरण दर्ज करें

  • स्वरूपण केवल मानों के लिए कार्य करता है, न कि अनुक्रमणिका प्रविष्टियाँ:

    constants = pd.DataFrame([('pi',np.pi),('e',np.e)],
                   columns=['name','value'])
    constants.set_index('name',inplace=True)
    C = constants.style.format({'name': '~~ {} ~~', 'value':'--> {:15.10f} <--'})
    C

यहां छवि विवरण दर्ज करें


2
क्या मैं दुभाषिया के अंदर से DataFrame.style का उपयोग कर सकता हूं?
जेम्स

23

ऊपर unutbu के समान, आप applymapनिम्नानुसार भी उपयोग कर सकते हैं :

import pandas as pd
df = pd.DataFrame([123.4567, 234.5678, 345.6789, 456.7890],
                  index=['foo','bar','baz','quux'],
                  columns=['cost'])

df = df.applymap("${0:.2f}".format)

मुझे कॉल df.to_csv()करने से पहले इस दृष्टिकोण का उपयोग करना पसंद है, यह सुनिश्चित करने के लिए कि मेरी .csvफ़ाइल के सभी कॉलम में "अंक चौड़ाई" समान है। धन्यवाद!
jeschwar

5

मुझे अजगर प्रारूप () के साथ pandas.apply () का उपयोग करना पसंद है।

import pandas as pd
s = pd.Series([1.357, 1.489, 2.333333])

make_float = lambda x: "${:,.2f}".format(x)
s.apply(make_float)

इसके अलावा, यह आसानी से कई स्तंभों के साथ इस्तेमाल किया जा सकता है ...

df = pd.concat([s, s * 2], axis=1)

make_floats = lambda row: "${:,.2f}, ${:,.3f}".format(row[0], row[1])
df.apply(make_floats, axis=1)

2

मुद्रा प्रारूप का उपयोग करने के लिए आप अपने क्षेत्र में लोकल सेट कर सकते हैं और फ्लोट_फॉर्मेट सेट कर सकते हैं। यह संयुक्त राज्य अमेरिका में मुद्रा के लिए स्वचालित रूप से $ साइन सेट करेगा।

import locale

locale.setlocale(locale.LC_ALL, "en_US.UTF-8")

pd.set_option("float_format", locale.currency)

df = pd.DataFrame(
    [123.4567, 234.5678, 345.6789, 456.7890],
    index=["foo", "bar", "baz", "quux"],
    columns=["cost"],
)
print(df)

        cost
foo  $123.46
bar  $234.57
baz  $345.68
quux $456.79

0

सारांश:


    df = pd.DataFrame({'money': [100.456, 200.789], 'share': ['100,000', '200,000']})
    print(df)
    print(df.to_string(formatters={'money': '${:,.2f}'.format}))
    for col_name in ('share',):
        df[col_name] = df[col_name].map(lambda p: int(p.replace(',', '')))
    print(df)
    """
        money    share
    0  100.456  100,000
    1  200.789  200,000

        money    share
    0 $100.46  100,000
    1 $200.79  200,000

         money   share
    0  100.456  100000
    1  200.789  200000
    """
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.