web-dev-qa-db-ja.com

パンダでデータフレームのナンの値を空のリスト[]で埋める方法は?

これは私のデータフレームです:

_          date                          ids
0     2011-04-23  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,...
1     2011-04-24  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,...
2     2011-04-25  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,...
3     2011-04-26  Nan
4     2011-04-27  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,...
5     2011-04-28  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,...
_

Nanを[]に置き換えたい。どうやってするか? Fillna([])は機能しませんでした。私もreplace(np.nan, [])を試しましたが、エラーが発生します:

_ TypeError('Invalid "to_replace" type: \'float\'',)
_
28
ALH

最初にlocを使用してnan列にidsがあるすべての行を検索し、次にatを使用してこれらの行をループして値を設定できます空のリストに:

for row in df.loc[df.ids.isnull(), 'ids'].index:
    df.at[row, 'ids'] = []

>>> df
        date                                             ids
0 2011-04-23  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
1 2011-04-24  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
2 2011-04-25  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
3 2011-04-26                                              []
4 2011-04-27  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
5 2011-04-28  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
14
Alexander

私のアプローチは@hellpanderrrのアプローチに似ていますが、代わりにisnanを使用するのではなく、リスト性をテストします。

df['ids'] = df['ids'].apply(lambda d: d if isinstance(d, list) else [])

最初はpd.isnull(またはpd.notnull)を使用してみましたが、リストを指定すると、各要素のnull値が返されます。

17
Nick Edgar

多くの頭を悩ませた後、私はこの方法が最も効率的である必要があることを発見しました(ループなし、適用なし)、スライスに割り当てるだけです:

_isnull = df.ids.isnull()

df.loc[isnull, 'ids'] = [ [[]] * isnull.sum() ]
_

トリックは、適切なサイズの_[]_のリストを作成して(isnull.sum())、thenで囲むことでしたリスト:割り当てている値は空のリストを要素として含む2D配列(1列、isnull.sum()行)です。

10
PlasmaBinturong

割り当てなし:

1)データフレームに浮動小数点数と整数のみがあると仮定します

import math
df.apply(lambda x:x.apply(lambda x:[] if math.isnan(x) else x))

2)任意のデータフレーム

import math
def isnan(x):
    if isinstance(x, (int, long, float, complex)) and math.isnan(x):
        return True

df.apply(lambda x:x.apply(lambda x:[] if isnan(x) else x))
1
hellpanderr

これはおそらくより高速な、1つのライナーソリューションです。

df['ids'].fillna('DELETE').apply(lambda x : [] if x=='DELETE' else x)
0
botivegh

多分もっと密:

df['ids'] = [[] if type(x) != list else x for x in df['ids']]
0
keramat

Numpyを使用した別のソリューション:

df.ids = np.where(df.ids.isnull(), pd.Series([[]]*len(df)), df.ids)

または、combine_firstを使用します。

df.ids = df.ids.combine_first(pd.Series([[]]*len(df)))
0
Allen