열의 형식 문자열을 사용하여 수레의 팬더 DataFrame을 표시하는 방법은 무엇입니까?


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유일한 float 열 입니까 , 아니면 형식을 지정하지 않아야하는 다른 float 열이 $있습니까?
unutbu

비용 열에 만 적용하고 싶습니다 (실제 데이터에는 다른 열이 있음)
Jason S

$가 연결되면 데이터 유형이 자동으로 객체로 변경됩니다.
Nguai al

답변:


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에서 여전히 제대로 작동합니다.
Taylor Edmiston 2019

19
예를 들어 여기에 표시된 것처럼 다음 을 사용하여 주어진 블록에 대해서만 옵션을 수정할 수 있습니다.with pd.option_context('display.float_format', '${:,.2f}'.format'):
Andre Holzner

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
pianoJames

56

Pandas 0.17부터는 이제 파이썬 형식 문자열을 사용하여 DataFrame의 형식화 된 뷰를 제공 하는 스타일링 시스템있습니다 .

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

어떤 표시

여기에 이미지 설명을 입력하십시오

이것은 뷰 객체입니다. DataFrame 자체는 형식이 변경되지 않지만 DataFrame의 업데이트는보기에 반영됩니다.

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을 사용할 수 있습니까?
Jms

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

python format ()과 함께 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

로케일을 해당 지역으로 설정하고 통화 형식을 사용하도록 float_format을 설정할 수도 있습니다. 미국에서 통화의 $ 표시가 자동으로 설정됩니다.

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
    """
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.