pandas.concatenate(...,axis=0,...)
複数のDataFramesが必要です。その結果得られるDataFrameには、行が属するデータセットについての情報を保持する新しい列がありますが、元のDataFramesの暗黙的なインデックスは削除されます。pandas DataFramesの行のsource-dataframe/-categoryを連結
たとえば、このMWEでは、DataFrames df1
とdf2
の人の高さと重さをそれぞれ複数の国(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
で望ましい結果を得ることができます。
は、したがって、私の二つの質問:
- 私はこれを適切に行うための別の方法足りませんか?
ignore_index
-flagの動作が間違っているか、誤解を招く可能性があり、バグレポートの対象となるはずですか?最初は、インデックス情報を離れて投げるために言って、第二は、MultiIndex
を作るためにそれを使用すると言う -ignore_index
とkeys
の両方を使用して
'pd.concat([キーのdf.assign(国籍=キー)、ZIPにdfを(キー、DFS)]、ignore_index =真)は'実際に、必要な結果をもたらします。私にとっては、Pythonの機能を使ってDataFramesの操作が不足しているように思えますが、それはイデオロギー的な意見です。しかし、その解決法には実際的な制限があります。部分フレームによって占められるメモリの3倍を、 '.assign()'からのコピーなしで2回ではなく使用します。そして、 '.assign()'をインプレースで行うと、見栄えの良いリスト補完を、醜いループ 'df [" Nationality "] = key'に置き換えなければなりません。 –
私はあなたが言っていることを得るが、パンダを使っている間にコピーを避けようとするのは反パターンであり、やりにくい(そしてコピーはかなり速い!)。例えば、私は 'df [..] = key'は(dfの構成によって)コピーも含むかもしれないと思います。実際には、実際にメモリの問題に遭遇してから最適化する(または 'dask'のようなものを使用する)までは心配しないほうがはるかに簡単だと思います – chrisb
>' df [..] = key'は[。 ..]もコピーを含む - AFAIK各列は独立した配列として保持され、追加と削除は他の列をコピーしないでください。しかし、あなたのパンダスコアを考慮すると、これが真実でないか、あなたがパンダのソースを掘ったケースを見つけましたか? ; [...] - 私は完全に同意します。これまでに起こったことがなければ心配しません。 :/ –