次の例を取り上げます。
_>>> df1 = pd.DataFrame({"x":[1, 2, 3, 4, 5],
"y":[3, 4, 5, 6, 7]},
index=['a', 'b', 'c', 'd', 'e'])
>>> df2 = pd.DataFrame({"y":[1, 3, 5, 7, 9],
"z":[9, 8, 7, 6, 5]},
index=['b', 'c', 'd', 'e', 'f'])
>>> pd.concat([df1, df2], join='inner')
_
出力は次のとおりです。
_ y
a 3
b 4
c 5
d 6
e 7
b 1
c 3
d 5
e 7
f 9
_
_axis=0
_は列なので、concat()
は両方のデータフレームにあるcolumnsのみを考慮すると思います。ただし、実際の出力では、両方のデータフレームにある行が考慮されます。
axis
パラメーターの正確な意味は何ですか?
データ:
In [55]: df1
Out[55]:
x y
a 1 3
b 2 4
c 3 5
d 4 6
e 5 7
In [56]: df2
Out[56]:
y z
b 1 9
c 3 8
d 5 7
e 7 6
f 9 5
連結水平(軸= 1)、インデックス要素を使用して、両方のDFにあります(結合のためにインデックスで整列):
In [57]: pd.concat([df1, df2], join='inner', axis=1)
Out[57]:
x y y z
b 2 4 1 9
c 3 5 3 8
d 4 6 5 7
e 5 7 7 6
連結垂直(デフォルト:axis = 0)、両方のDFにあるcolumnsを使用:
In [58]: pd.concat([df1, df2], join='inner')
Out[58]:
y
a 3
b 4
c 5
d 6
e 7
b 1
c 3
d 5
e 7
f 9
inner
結合メソッドを使用しない場合、次のようになります。
In [62]: pd.concat([df1, df2])
Out[62]:
x y z
a 1.0 3 NaN
b 2.0 4 NaN
c 3.0 5 NaN
d 4.0 6 NaN
e 5.0 7 NaN
b NaN 1 9.0
c NaN 3 8.0
d NaN 5 7.0
e NaN 7 6.0
f NaN 9 5.0
In [63]: pd.concat([df1, df2], axis=1)
Out[63]:
x y y z
a 1.0 3.0 NaN NaN
b 2.0 4.0 1.0 9.0
c 3.0 5.0 3.0 8.0
d 4.0 6.0 5.0 7.0
e 5.0 7.0 7.0 6.0
f NaN NaN 9.0 5.0
これは軸に関する私のトリックです:操作を頭に追加するだけで、明確に聞こえます:
Axis = 0で「合計」すると、すべての行が合計され、出力は同じ列数の単一行になります。 axis = 1を「合計」すると、すべての列が合計され、出力は同じ行数の単一の列になります。
まず、OPは自分のデータフレームの行と列を誤解していました。
ただし、実際の出力では、両方のデータフレームで見つかった行が考慮されます(唯一の一般的な行要素 'y')
OPは、ラベルy
は行用であると考えました。ただし、y
は列名です。
_df1 = pd.DataFrame(
{"x":[1, 2, 3, 4, 5], # <-- looks like row x but actually col x
"y":[3, 4, 5, 6, 7]}, # <-- looks like row y but actually col y
index=['a', 'b', 'c', 'd', 'e'])
print(df1)
\col x y
index or row\
a 1 3 | a
b 2 4 v x
c 3 5 r i
d 4 6 o s
e 5 7 w 0
-> column
a x i s 1
_
辞書では、y
とx
が2行であるように見えるため、誤解されやすいです。
リストのリストから_df1
_を生成する場合、より直感的になります。
_df1 = pd.DataFrame([[1,3],
[2,4],
[3,5],
[4,6],
[5,7]],
index=['a', 'b', 'c', 'd', 'e'], columns=["x", "y"])
_
問題に戻ると、concat
はconcatenateの省略形です(この方法でシリーズまたはチェーンでリンクすることを意味します [ソース] )concat
along軸0を実行すると、2つのオブジェクトをリンクすることを意味しますalong軸0。
_ 1
1 <-- series 1
1
^ ^ ^
| | | 1
c a a 1
o l x 1
n o i gives you 2
c n s 2
a g 0 2
t | |
| V V
v
2
2 <--- series 2
2
_
だから...あなたは今感じていると思う。パンダの sum
関数はどうですか? sum(axis=0)
はどういう意味ですか?
データが次のように見えるとします
_ 1 2
1 2
1 2
_
たぶん... summingalongaxis 0、あなたは推測するかもしれません。はい!!
_^ ^ ^
| | |
s a a
u l x
m o i gives you two values 3 6 !
| n s
v g 0
| |
V V
_
dropna
についてはどうですか?データがあるとします
_ 1 2 NaN
NaN 3 5
2 4 6
_
そして、あなただけを保ちたい
_2
3
4
_
ドキュメントでは、と言い、特定の軸のラベルが省略されたオブジェクトを返し、代わりにデータの一部またはすべてが欠落している
dropna(axis=0)
またはdropna(axis=1)
を配置する必要がありますか?それについて考えて、試してみてください
_df = pd.DataFrame([[1, 2, np.nan],
[np.nan, 3, 5],
[2, 4, 6]])
# df.dropna(axis=0) or df.dropna(axis=1) ?
_
ヒント:Wordalongについて考えてください。
Axis = 0を解釈して、各列にアルゴリズムを適用するか、行ラベル(インデックス)に適用します。より詳細なスキーマ here 。
その一般的な解釈をケースに適用する場合、ここでのアルゴリズムはconcat
です。したがって、axis = 0の場合、次のことを意味します。
各列について、すべての行を下に(concat
のすべてのデータフレームにわたって)取り、それらが共通であるときにそれらに連絡します(join=inner
を選択したため) )。
したがって、意味は、すべての列x
を取得し、それらを行に連結して、行の各チャンクを次々にスタックすることです。ただし、ここx
はどこにも存在しないため、最終結果のために保持されません。 z
にも同じことが当てはまります。 y
の場合、結果はy
がすべてのデータフレームにあるため保持されます。これが結果です。