2016-06-17 6 views
0

pandas.concatenate(...,axis=0,...)複数のDataFramesが必要です。その結果得られるDataFrameには、行が属するデータセットについての情報を保持する新しい列がありますが、元のDataFramesの暗黙的なインデックスは削除されます。pandas DataFramesの行のsource-dataframe/-categoryを連結

たとえば、このMWEでは、DataFrames df1df2の人の高さと重さをそれぞれ複数の国(AとBなど)から取得しています。

import pandas as pd 

df1 = pd.DataFrame({'Weight': [5, 4, 6], 'Height': [170, 172, 180]}) 
df2 = pd.DataFrame({'Weight': [4, 4, 5], 'Height': [180, 181, 169]}) 

行ごとに国を格納するために必要df連結データフレームが、

df = pd.concat([df1, df2], keys=list('AB'), names=["Country"]).reset_index() 
print df 

> Nationality level_1 Height Weight 
>0   A  0  170  5 
>1   A  1  172  4 
>2   A  2  180  6 
>3   B  0  180  4 
>4   B  1  181  4 
>5   B  2  169  5 

df = pd.concat([df1, df2], keys=list('AB'), names=["Country"], ignore_index=True).reset_index() 
print df 
> Height Weight 
>0  170  5 
>1  172  4 
>2  180  6 
>3  180  4 
>4  181  4 
>5  169  5 
ながら、追加の列の "古い" 暗黙指数( level_1)に沿って搬送します

は、ソースDataFramesのインデックスではなく、新しいDataFrameのインデックスとしてマークされたカラムを無視します少なくともkeysおよびnamesが提供される場合)。

私は、構文上の悪夢の私見である

df = pd.concat([df1, df2], keys=list(list('AB')), names=["Nationality"]).reset_index(0).reset_index(0, drop=True) 
print df 

>  Nationality Height Weight 
>0   A  170  5 
>1   A  172  4 
>2   A  180  6 
>3   B  180  4 
>4   B  181  4 
>5   B  169  5 

で望ましい結果を得ることができます。

は、したがって、私の二つの質問:

  1. 私はこれを適切に行うための別の方法足りませんか?
  2. ignore_index -flagの動作が間違っているか、誤解を招く可能性があり、バグレポートの対象となるはずですか?最初は、インデックス情報を離れて投げるために言って、第二は、MultiIndexを作るためにそれを使用すると言う - ignore_indexkeysの両方を使用して

答えて

0

はやや矛盾です。つまり、パンダは両方をパスすれば、より良いメッセージを伝えることができます(おそらくちょうどValueErrorを挙げてください)、問題を起こすことができます。

あなたが望むことを達成するための別の方法があります。

In [2]: keys = ['A', 'B'] 

In [3]: dfs = [df1, df2] 

In [4]: df = pd.concat([df.assign(Nationality=key) for key, df 
    ...:     in zip(keys, dfs)]) 

In [5]: df 
Out[5]: 
    Height Weight Nationality 
0  170  5   A 
1  172  4   A 
2  180  6   A 
0  180  4   B 
1  181  4   B 
2  169  5   B 
+0

'pd.concat([キーのdf.assign(国籍=キー)、ZIPにdfを(キー、DFS)]、ignore_index =真)は'実際に、必要な結果をもたらします。私にとっては、Pythonの機能を使ってDataFramesの操作が不足しているように思えますが、それはイデオロギー的な意見です。しかし、その解決法には実際的な制限があります。部分フレームによって占められるメモリの3倍を、 '.assign()'からのコピーなしで2回ではなく使用します。そして、 '.assign()'をインプレースで行うと、見栄えの良いリスト補完を、醜いループ 'df [" Nationality "] = key'に置き換えなければなりません。 –

+0

私はあなたが言っていることを得るが、パンダを使っている間にコピーを避けようとするのは反パターンであり、やりにくい(そしてコピーはかなり速い!)。例えば、私は 'df [..] = key'は(dfの構成によって)コピーも含むかもしれないと思います。実際には、実際にメモリの問題に遭遇してから最適化する(または 'dask'のようなものを使用する)までは心配しないほうがはるかに簡単だと思います – chrisb

+0

>' df [..] = key'は[。 ..]もコピーを含む - AFAIK各列は独立した配列として保持され、追加と削除は他の列をコピーしないでください。しかし、あなたのパンダスコアを考慮すると、これが真実でないか、あなたがパンダのソースを掘ったケースを見つけましたか? ; [...] - 私は完全に同意します。これまでに起こったことがなければ心配しません。 :/ –

関連する問題