これは私のデータフレームです:
_ 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\'',)
_
最初に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]
私のアプローチは@hellpanderrrのアプローチに似ていますが、代わりにisnan
を使用するのではなく、リスト性をテストします。
df['ids'] = df['ids'].apply(lambda d: d if isinstance(d, list) else [])
最初はpd.isnull
(またはpd.notnull
)を使用してみましたが、リストを指定すると、各要素のnull値が返されます。
多くの頭を悩ませた後、私はこの方法が最も効率的である必要があることを発見しました(ループなし、適用なし)、スライスに割り当てるだけです:
_isnull = df.ids.isnull()
df.loc[isnull, 'ids'] = [ [[]] * isnull.sum() ]
_
トリックは、適切なサイズの_[]
_のリストを作成して(isnull.sum()
)、thenで囲むことでしたリスト:割り当てている値は空のリストを要素として含む2D配列(1列、isnull.sum()
行)です。
割り当てなし:
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つのライナーソリューションです。
df['ids'].fillna('DELETE').apply(lambda x : [] if x=='DELETE' else x)
多分もっと密:
df['ids'] = [[] if type(x) != list else x for x in df['ids']]
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)))