2017-10-02 32 views
0

Seriesをデータフレームに連結していますが、列名(シリーズ名)が新しいデータフレームに表示されません。パンダシリーズ名がデータフレームの一部として表示されない

代わりに、最後のデータフレームに列の名前が「0」ですが、apply_joinメソッドで作成されているときにその名前が表示されます。

なぜデータフレームにシリーズ名が表示されないのですか?

import pandas as pd 
from io import StringIO 

tibble3_csv = """country,year,cases,population 
Afghanistan,1999,745,19987071 
Afghanistan,2000,2666,20595360""" 
with StringIO(tibble3_csv) as fp: 
    tibble3 = pd.read_csv(fp) 

def str_join_elements(x, sep=""): 
    assert type(sep) is str 
    return sep.join((str(xi) for xi in x)) 

def unite(df, cols, new_var, combine=str_join_elements): 
    def apply_join(x, combine): 
     joinstr = combine(x) 
     ser = pd.Series(joinstr, name=new_var) 
     print(ser.name) 
     return ser 

    fixed_vars = df.columns.difference(cols) 
    tibble = df[fixed_vars].copy() 
    tibble_extra = df[cols].apply(apply_join, combine=combine, axis=1) 

    return pd.concat([tibble, tibble_extra], axis=1) 

tab = unite(tibble3, ['cases', 'population'], 'rate', combine=lambda x: str_join_elements(x, "/")) 
print(tab) 

結果:

rate 
rate 
     country year     0 
0 Afghanistan 1999  745/19987071 
1 Afghanistan 2000  2666/20595360 

答えて

0

あなたは列の未知の数を連結しようとしている場合は、str.joinapplyを使用することができます。

def foo(df, columns, col_name, sep=''): 
    s = df[columns].apply(lambda x: sep.join(map(str, x)), 1) 
    s.name = col_name 
    return pd.concat([df[df.columns.difference(columns)], s], axis=1) 

df 
     country year cases population 
0 Afghanistan 1999 745 19987071 
1 Afghanistan 2000 2666 20595360 

df2 = foo(df, ['cases', 'population'], 'rate', '/') 
df2 
     country year   rate 
0 Afghanistan 1999 745/19987071 
1 Afghanistan 2000 2666/20595360 

それは常に起こっている場合2列になるようにするには、str.catを使うことができます。これははるかに高速です。

def foo2(df, c1, c2, c3, sep=''): 
    s1, s2 = df[c1].astype(str), df[c2].astype(str) 
    s3 = s1.str.cat(s2, sep=sep) 
    s3.name = c3 
    return pd.concat([df[df.columns.difference([c1, c2])], s3], axis=1) 

df2 = foo2(df, 'cases', 'population', 'rate', '/') 
df2 
     country year   rate 
0 Afghanistan 1999 745/19987071 
1 Afghanistan 2000 2666/20595360 
+0

を使用して、列の名前を変更しようとすることができます。これは代入ですが、 "foo/unite"のメソッドシグネチャには、渡される関数が含まれています。この場合、「結合」します。 – cumin

+0

@cuminさて、 'pd.concat'を呼び出す前に' tibble_extra.name = 'rate''を使ってください。 :/ –

+0

@cumin 'tibble_extra'の結果に名前がないため、元のデータフレームに名前の列がない理由はです。あなたはそれに1つを割り当てる必要があります。この名前は後で出力dfの一部になります。 –

0

また、ちょうど私があなたのシンプルなソリューションを好き

>>> tab = tab.rename(columns = {0:'cases/population'}) 
>>> tab 
     country year cases/population 
0 Afghanistan 1999  745/19987071 
1 Afghanistan 2000 2666/20595360 
>>> 
+0

ありがとう、それは動作します。しかし、列が 'print(ser.name)'で作られているときに、なぜ列の名前( "rate")が表示されないのですか? – cumin

関連する問題