別の列にデータがありますが、それを抽出して別の変数に保存する方法がわかりません。
index a b c
1 2 3 4
2 3 4 5
'a'
を選択し'b'
てdf1に保存するにはどうすればよいですか?
私は試した
df1 = df['a':'b']
df1 = df.ix[:, 'a':'b']
どれも機能していないようです。
列名(文字列)は、試した方法でスライスすることはできません。
ここにいくつかのオプションがあります。スライスする変数がコンテキストからわかっている場合は、__getitem__
構文([])にリストを渡すことで、それらの列のみのビューを返すことができます。
df1 = df[['a', 'b']]
または、名前ではなく数値でインデックスを作成することが重要な場合(たとえば、コードは最初の2列の名前を知らなくても自動的にインデックスを作成する必要がある場合)、代わりに次のように実行できます。
df1 = df.iloc[:, 0:2] # Remember that Python does not slice inclusive of the ending index.
さらに、Pandasオブジェクトとそのオブジェクトのコピーのビューの概念をよく理解しておく必要があります。上記の最初のメソッドは、目的のサブオブジェクト(目的のスライス)のメモリに新しいコピーを返します。
ただし、Pandasには、これを行わず、代わりに、元のオブジェクトのサブオブジェクトまたはスライスと同じメモリチャンクを参照するだけの新しい変数を提供するインデックス付け規則がある場合があります。これは、インデックス作成の2番目の方法で発生するため、.copy()
メソッドを使用して変更し、通常のコピーを取得できます。この場合、スライスされたオブジェクトと思われるものを変更すると、元のオブジェクトが変更されることがあります。これに注意することは常に良いことです。
df1 = df.iloc[0, 0:2].copy() # To avoid the case where changing df1 also changes df
を使用するiloc
には、列の位置(またはインデックス)を知っている必要があります。列の位置が変わる可能性があるため、インデックスをハードコーディングする代わりに、データフレームオブジェクトのメソッドの関数とiloc
一緒に使用して列のインデックスを取得できます。get_loc
columns
{df.columns.get_loc(c): c for idx, c in enumerate(df.columns)}
これで、このディクショナリを使用して、名前とを使用して列にアクセスできますiloc
。
バージョン0.11.0以降、インデクサーを使用して試した方法で列をスライスできます。.loc
df.loc[:, 'C':'E']
と同等です
df[['C', 'D', 'E']] # or df.loc[:, ['C', 'D', 'E']]
C
までの列を返しますE
。
ランダムに生成されたDataFrameのデモ:
import pandas as pd
import numpy as np
np.random.seed(5)
df = pd.DataFrame(np.random.randint(100, size=(100, 6)),
columns=list('ABCDEF'),
index=['R{}'.format(i) for i in range(100)])
df.head()
Out:
A B C D E F
R0 99 78 61 16 73 8
R1 62 27 30 80 7 76
R2 15 53 80 27 44 77
R3 75 65 47 30 84 86
R4 18 9 41 62 1 82
CからEまでの列を取得するには(整数スライスとは異なり、「E」が列に含まれていることに注意してください)。
df.loc[:, 'C':'E']
Out:
C D E
R0 61 16 73
R1 30 80 7
R2 80 27 44
R3 47 30 84
R4 41 62 1
R5 5 58 0
...
ラベルに基づいて行を選択する場合も同じように機能します。これらの列から行「R6」から「R10」を取得します。
df.loc['R6':'R10', 'C':'E']
Out:
C D E
R6 51 27 31
R7 83 19 18
R8 11 67 65
R9 78 27 29
R10 7 16 94
.loc
ブール配列も受け入れるため、配列内の対応するエントリがである列を選択できますTrue
。たとえば、列名がリストにある場合は-Trueをdf.columns.isin(list('BCD'))
返します。それ以外の場合はFalse。array([False, True, True, True, False, False], dtype=bool)
['B', 'C', 'D']
df.loc[:, df.columns.isin(list('BCD'))]
Out:
B C D
R0 78 61 16
R1 27 30 80
R2 53 80 27
R3 65 47 30
R4 9 41 62
R5 78 5 58
...
列名(df.columns
)が['index','a','b','c']
であるとすると、必要なデータは3番目と4番目の列にあります。スクリプトの実行時に名前がわからない場合は、これを行うことができます
newdf = df[df.columns[2:4]] # Remember, Python is zero-offset! The "third" entry is at slot two.
EMSが彼の回答で指摘しているように、df.ix
列をもう少し簡潔に.columns
スライスしますが、バニラ1次元Pythonリストのインデックス作成/スライス構文を使用しているため、スライスインターフェイスはより自然な場合があります。
警告:列'index'
の名前がDataFrame
同じラベルは、実際のdf.index
属性であるIndex
配列にも使用されます。したがって、列はによって返されdf['index']
、実際のDataFrameインデックスはによって返されdf.index
ます。Anその要素の値を検索するために最適化されIndex
た特別な種類Series
df.indexの場合、ラベルで行を検索するためのものです。そのdf.columns
属性はpd.Index
、ラベルで列を検索するための配列でもあります。
パンダの最新バージョンでは、これを正確に行う簡単な方法があります。列名(文字列)は、好きな方法でスライスできます。
columns = ['b', 'c']
df1 = pd.DataFrame(df, columns=columns)
In [39]: df
Out[39]:
index a b c
0 1 2 3 4
1 2 3 4 5
In [40]: df1 = df[['b', 'c']]
In [41]: df1
Out[41]:
b c
0 3 4
1 4 5
パンダで、
ウィット列名
dataframe[['column1','column2']]
ilocおよびインデックス番号を持つ特定の列で選択するには:
dataframe.iloc[:,[1,2]]
loc列名は次のように使用できます
dataframe.loc[:,['column1','column2']]
ドロップする列のリストを提供し、PandasDataFrameの関数を使用して必要な列のみを含むDataFrameを返すことができますdrop()
。
ただ言って
colsToDrop = ['a']
df.drop(colsToDrop, axis=1)
b
列と。だけのDataFrameを返しますc
。
このdrop
方法はここに記載されています。
この方法は非常に便利であることがわかりました。
# iloc[row slicing, column slicing]
surveys_df.iloc [0:3, 1:4]
詳細については、こちらをご覧ください。
0.21.0以降、1つ以上のラベルが欠落しているリストを使用する.loc
か、リストを使用することは廃止され、。が優先されます。したがって、あなたの質問に対する答えは次のとおりです。[]
.reindex
df1 = df.reindex(columns=['b','c'])
以前のバージョンで.loc[list-of-labels]
は、少なくとも1つのキーが見つかった場合に限り、を使用できます(そうでない場合は、が発生しますKeyError
)。この動作は廃止され、警告メッセージが表示されるようになりました。推奨される代替手段は、を使用すること.reindex()
です。
詳細については、データのインデックス作成と選択をご覧ください。
このメソッドを使用して、次のpandas.DataFrame.filter
ように列をフィルタリングまたは並べ替えることができます。
df1 = df.filter(['a', 'b'])
これは、メソッドをチェーンするときにも非常に役立ちます。
パンダを使用できます。
DataFrameを作成します。
import pandas as pd
df = pd.DataFrame([[1, 2,5], [5,4, 5], [7,7, 8], [7,6,9]],
index=['Jane', 'Peter','Alex','Ann'],
columns=['Test_1', 'Test_2', 'Test_3'])
DataFrame:
Test_1 Test_2 Test_3
Jane 1 2 5
Peter 5 4 5
Alex 7 7 8
Ann 7 6 9
名前で1つ以上の列を選択するには:
df[['Test_1', 'Test_3']]
Test_1 Test_3
Jane 1 5
Peter 5 5
Alex 7 8
Ann 7 9
次のものも使用できます。
df.Test_2
そして、あなたは列を取得しますTest_2
:
Jane 2
Peter 4
Alex 7
Ann 6
を使用して、これらの行から列と行を選択することもできます.loc()
。これは「スライス」と呼ばれます。私が列Test_1
からTest_3
:に取っていることに注意してください
df.loc[:, 'Test_1':'Test_3']
「スライス」は次のとおりです。
Test_1 Test_2 Test_3
Jane 1 2 5
Peter 5 4 5
Alex 7 7 8
Ann 7 6 9
そして、あなたがちょうど欲しいなら、そしてPeter
列Ann
からTest_1
そしてTest_3
:
df.loc[['Peter', 'Ann'], ['Test_1', 'Test_3']]
あなたが得る:
Test_1 Test_3
Peter 5 5
Ann 7 9
行インデックスと列名で1つの要素を取得する場合は、と同じように実行できますdf['b'][0]
。それはあなたが想像できる限り簡単です。
または、使用することができますdf.ix[0,'b']
-インデックスとラベルの混合使用。
注: v0.20以降、 /ix
を優先して非推奨になりました。loc
iloc
使用してみてくださいpandas.DataFrame.get
(ドキュメントを参照):
import pandas as pd
import numpy as np
dates = pd.date_range('20200102', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
df.get(['A', 'C'])
1つの異なる簡単なアプローチ:行の反復
df1 = pd.DataFrame() # Creating an empty dataframe
for index,i in df.iterrows():
df1.loc[index, 'A'] = df.loc[index, 'A']
df1.loc[index, 'B'] = df.loc[index, 'B']
df1.head()
df[['a', 'b']] # Select all rows of 'a' and 'b'column
df.loc[0:10, ['a', 'b']] # Index 0 to 10 select column 'a' and 'b'
df.loc[0:10, 'a':'b'] # Index 0 to 10 select column 'a' to 'b'
df.iloc[0:10, 3:5] # Index 0 to 10 and column 3 to 5
df.iloc[3, 3:5] # Index 3 of column 3 to 5
前の回答で説明したさまざまなアプローチは、ユーザーがドロップまたはサブセット化する列インデックスを知っているか、ユーザーが列の範囲(たとえば、「C」:「E」の間)を使用してデータフレームをサブセット化することを望んでいるという仮定に基づいています。 )。
pandas.DataFrame.drop()は確かに、ユーザーが定義した列のリストに基づいてデータをサブセット化するオプションです(ただし、常にデータフレームのコピーを使用することに注意する必要があり、インプレースパラメーターをTrueに設定しないでください!!)
もう1つのオプションは、pandas.columns.difference()を使用することです。これは、列名に一定の違いを与え、目的の列を含む配列のインデックスタイプを返します。解決策は次のとおりです。
df = pd.DataFrame([[2,3,4], [3,4,5]], columns=['a','b','c'], index=[1,2])
columns_for_differencing = ['a']
df1 = df.copy()[df.columns.difference(columns_for_differencing)]
print(df1)
出力は次のようになります。
b c
1 3 4
2 4 5
df.pop()を使用することもできます:
>>> df = pd.DataFrame([('falcon', 'bird', 389.0),
... ('parrot', 'bird', 24.0),
... ('lion', 'mammal', 80.5),
... ('monkey', 'mammal', np.nan)],
... columns=('name', 'class', 'max_speed'))
>>> df
name class max_speed
0 falcon bird 389.0
1 parrot bird 24.0
2 lion mammal 80.5
3 monkey mammal
>>> df.pop('class')
0 bird
1 bird
2 mammal
3 mammal
Name: class, dtype: object
>>> df
name max_speed
0 falcon 389.0
1 parrot 24.0
2 lion 80.5
3 monkey NaN
を使用してくださいdf.pop(c)
。
私はそれについていくつかの答えを見てきましたが、1つは私には不明なままでした。関心のある列をどのように選択しますか?
その答えは、それらをリストに集めている場合は、リストを使用して列を参照するだけでよいということです。
print(extracted_features.shape)
print(extracted_features)
(63,)
['f000004' 'f000005' 'f000006' 'f000014' 'f000039' 'f000040' 'f000043'
'f000047' 'f000048' 'f000049' 'f000050' 'f000051' 'f000052' 'f000053'
'f000054' 'f000055' 'f000056' 'f000057' 'f000058' 'f000059' 'f000060'
'f000061' 'f000062' 'f000063' 'f000064' 'f000065' 'f000066' 'f000067'
'f000068' 'f000069' 'f000070' 'f000071' 'f000072' 'f000073' 'f000074'
'f000075' 'f000076' 'f000077' 'f000078' 'f000079' 'f000080' 'f000081'
'f000082' 'f000083' 'f000084' 'f000085' 'f000086' 'f000087' 'f000088'
'f000089' 'f000090' 'f000091' 'f000092' 'f000093' 'f000094' 'f000095'
'f000096' 'f000097' 'f000098' 'f000099' 'f000100' 'f000101' 'f000103']
次のリスト/NumPy配列extracted_features
があり、63列を指定しています。元のデータセットには103の列があり、それらを正確に抽出したいので、
dataset[extracted_features]
そして、あなたはこれで終わるでしょう
これは、機械学習(より具体的には、特徴選択)で非常に頻繁に使用されるものです。他の方法についても話し合いたいと思いますが、それはすでに他のStackOverflowerユーザーによってカバーされていると思います。
複数の列を選択するには、後でそれらを抽出して表示します。df
新しいデータフレームを作成するのではなく、以前はデータフレームという名前で、抽出して表示df1
する列AからDを選択します。
df1 = pd.DataFrame(data_frame, columns=['Column A', 'Column B', 'Column C', 'Column D'])
df1
必要なすべての列が表示されます!
def get_slize(dataframe, start_row, end_row, start_col, end_col):
assert len(dataframe) > end_row and start_row >= 0
assert len(dataframe.columns) > end_col and start_col >= 0
list_of_indexes = list(dataframe.columns)[start_col:end_col]
ans = dataframe.iloc[start_row:end_row][list_of_indexes]
return ans
この関数を使用するだけです