名前に特定の文字列を含む列を検索する


137

列名を含むデータフレームがあり、特定の文字列を含むが、完全に一致しないものを見つけたいのですが。私が探してる'spike'ような列名で'spike-2''hey spike''spiked-in''spike'一部は常に連続しています)。

列名が文字列または変数として返されるようにしたいので、後で、df['name']またはdf[name]通常どおりに列にアクセスします。私はこれを行う方法を見つけようとしましたが、役に立ちませんでした。任意のヒント?

回答:


229

ただ繰り返すだけDataFrame.columnsですが、これは一致する列名のリストが作成される例です。

import pandas as pd

data = {'spike-2': [1,2,3], 'hey spke': [4,5,6], 'spiked-in': [7,8,9], 'no': [10,11,12]}
df = pd.DataFrame(data)

spike_cols = [col for col in df.columns if 'spike' in col]
print(list(df.columns))
print(spike_cols)

出力:

['hey spke', 'no', 'spike-2', 'spiked-in']
['spike-2', 'spiked-in']

説明:

  1. df.columns 列名のリストを返します
  2. [col for col in df.columns if 'spike' in col]df.columns変数colを使用してリストを反復処理し、colが含まれて'spike'いる場合は結果のリストに追加します。この構文はリスト内包です。

一致する列を持つ結果のデータセットのみが必要な場合は、次のようにできます。

df2 = df.filter(regex='spike')
print(df2)

出力:

   spike-2  spiked-in
0        1          7
1        2          8
2        3          9

1
すごい!PythonとPandasの両方でまだ新しいのですが、その仕組みが正確にはわかりません。おそらく説明してもらえますか?
erikfas 2014年

16
これがDataFrame.filterFYIの機能です(必要に応じて正規表現を指定できます)
Jeff

2
@xndrmeどのように正規表現を含めて、正規表現に一致する特定の列を除外するのですか?
Dhruv Ghulati 2016年

3
@DhruvGhulatiそれは同様にあなたの不要な列を削除することも可能であるdf[df.columns.drop(spike_cols)]あなたがそこに着く、DataFrameリスト内の列なしでspike_cols、あなたの望ましくない正規表現を使用して入手することができます。
Alvaro Fuentes

1
より簡潔なコード:df[[col for col in df.columns if "spike" in col]]
WindChimes 2016年

71

この答えは、DataFrame.filterメソッドを使用して、リストを理解せずにこれを実行します。

import pandas as pd

data = {'spike-2': [1,2,3], 'hey spke': [4,5,6]}
df = pd.DataFrame(data)

print(df.filter(like='spike').columns)

'spike-2'のみを出力します。上記のコメントで示唆されているように、正規表現を使用することもできます。

print(df.filter(regex='spike|spke').columns)

両方の列を出力します:['spike-2'、 'hey spke']






0

Start、Contains、Endsに基づく名前とサブセットの取得:

# from: /programming/21285380/find-column-whose-name-contains-a-specific-string
# from: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.contains.html
# from: https://cmdlinetips.com/2019/04/how-to-select-columns-using-prefix-suffix-of-column-names-in-pandas/
# from: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.filter.html




import pandas as pd



data = {'spike_starts': [1,2,3], 'ends_spike_starts': [4,5,6], 'ends_spike': [7,8,9], 'not': [10,11,12]}
df = pd.DataFrame(data)



print("\n")
print("----------------------------------------")
colNames_contains = df.columns[df.columns.str.contains(pat = 'spike')].tolist() 
print("Contains")
print(colNames_contains)



print("\n")
print("----------------------------------------")
colNames_starts = df.columns[df.columns.str.contains(pat = '^spike')].tolist() 
print("Starts")
print(colNames_starts)



print("\n")
print("----------------------------------------")
colNames_ends = df.columns[df.columns.str.contains(pat = 'spike$')].tolist() 
print("Ends")
print(colNames_ends)



print("\n")
print("----------------------------------------")
df_subset_start = df.filter(regex='^spike',axis=1)
print("Starts")
print(df_subset_start)



print("\n")
print("----------------------------------------")
df_subset_contains = df.filter(regex='spike',axis=1)
print("Contains")
print(df_subset_contains)



print("\n")
print("----------------------------------------")
df_subset_ends = df.filter(regex='spike$',axis=1)
print("Ends")
print(df_subset_ends)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.