web-dev-qa-db-ja.com

空のリストを持つ行をpandas dataframeから削除します

空のリストを含む列と文字列のリストを含む列を持つデータフレームがあります。

       donation_orgs                              donation_context
0            []                                           []
1   [the research of Dr. ...]   [In lieu of flowers , memorial donations ...]

空のリストがある行を含まないデータセットを返そうとしています。

私はnull値をチェックしようとしました:

dfnotnull = df[df.donation_orgs != []]
dfnotnull

そして

dfnotnull = df[df.notnull().any(axis=1)]
pd.options.display.max_rows=500
dfnotnull

そして、ループして存在する値を確認しようとしましたが、リストがNullまたはNoneを返さないと思いました。

dfnotnull = pd.DataFrame(columns=('donation_orgs', 'donation_context'))
for i in range(0,len(df)):
    if df['donation_orgs'].iloc(i):
        dfnotnull.loc[i] = df.iloc[i]

上記の3つのメソッドはすべて、元のデータフレームのすべての行を単に返します。=

21
Ben Price

データフレームがリストではなく文字列であるかのようにスライスを試すことができます。

import pandas as pd
df = pd.DataFrame({
'donation_orgs' : [[], ['the research of Dr.']],
'donation_context': [[], ['In lieu of flowers , memorial donations']]})

df[df.astype(str)['donation_orgs'] != '[]']

Out[9]: 
                            donation_context          donation_orgs
1  [In lieu of flowers , memorial donations]  [the research of Dr.]
16
Woody Pride

strへの変換を回避し、実際にlistsを使用するには、次のようにします。

df[df['donation_orgs'].map(lambda d: len(d)) > 0]

donation_orgs列を各行のリストの長さに変換し、少なくとも1つの要素を含むものだけを保持します=、フィルタリング空のリストから。

戻る

Out[1]: 
                            donation_context          donation_orgs
1  [In lieu of flowers , memorial donations]  [the research of Dr.]

予想通り。

16
Victor

次のワンライナーを使用できます。

df[(df['donation_orgs'].str.len() != 0) | (df['donation_context'].str.len() != 0)]
4
Amirhos Imani