1. ホーム
  2. python

[解決済み] pandas dataframeのカラムに含まれるリストの長さを決定する方法

2023-07-03 01:21:32

質問

列のリストの長さを反復処理なしで決定するにはどうしたらよいでしょうか?

このようなデータフレームがあります。

                                                    CreationDate
2013-12-22 15:25:02                  [ubuntu, mac-osx, syslinux]
2009-12-14 14:29:32  [ubuntu, mod-rewrite, laconica, apache-2.2]
2013-12-22 15:42:00               [ubuntu, nat, squid, mikrotik]

の中でリストの長さを計算しています。 CreationDate カラムのリストの長さを計算し、新しい Length のようなカラムを作る。

df['Length'] = df.CreationDate.apply(lambda x: len(x))

とすると、こうなります。

                                                    CreationDate  Length
2013-12-22 15:25:02                  [ubuntu, mac-osx, syslinux]       3
2009-12-14 14:29:32  [ubuntu, mod-rewrite, laconica, apache-2.2]       4
2013-12-22 15:42:00               [ubuntu, nat, squid, mikrotik]       4

もっとpythonicな方法はないのでしょうか?

どのように解決するのですか?

を使用することができます。 str アクセサを使うこともできます。この例では

df['CreationDate'].str.len()

は各リストの長さを返します。のドキュメントを参照してください。 str.len .

df['Length'] = df['CreationDate'].str.len()
df
Out: 
                                                    CreationDate  Length
2013-12-22 15:25:02                  [ubuntu, mac-osx, syslinux]       3
2009-12-14 14:29:32  [ubuntu, mod-rewrite, laconica, apache-2.2]       4
2013-12-22 15:42:00               [ubuntu, nat, squid, mikrotik]       4

これらの操作については、一般にPythonのバニラの方が速いです。以下はそのタイミングです。

ser = pd.Series([random.sample(string.ascii_letters, 
                               random.randint(1, 20)) for _ in range(10**6)])

%timeit ser.apply(lambda x: len(x))
1 loop, best of 3: 425 ms per loop

%timeit ser.str.len()
1 loop, best of 3: 248 ms per loop

%timeit [len(x) for x in ser]
10 loops, best of 3: 84 ms per loop

%timeit pd.Series([len(x) for x in ser], index=ser.index)
1 loop, best of 3: 236 ms per loop