遍历 pandas DataFrame 中的行并创建一个字典

Iterate over rows in pandas DataFrame and create a dict

我正在尝试使用 pandas DataFrame 创建字典。

import pandas as pd

df = pd.DataFrame({'name': ["p1","p1","p2","p2","p2"],
                   'val': [0, 1, np.nan, 1, 0] })

我想创建一个字典,其中 name 列为 keyval 列为 values。值将是一个列表。我使用的是 for loop,因为 DataFrame 只有 100 行。

mydict = dict()
valList = []

for index, row in df.iterrows():

    # create list of values
    ......

    mydict[row['name']] = valList

预期输出:

{
 'p1': [0, 1],
 'p2': [nan, 1, 0]
}

对其他方法持开放态度,但我更倾向于使用 for loop and iterrows()

您可以使用 groupby 和字典理解:

d = {k:list(v) for k,v in df.groupby('name')['val']}

输出:

{'p1': [0.0, 1.0], 'p2': [nan, 1.0, 0.0]}
使用 iterrows(不是我最喜欢的选项)

注意。这在大数据帧上会很慢

from collections import defaultdict

d = defaultdict(list)

for _, row in df.iterrows():
    d[row['name']].append(row['val'])
    
dict(d)

您也可以尝试使用 to_numpy(),这似乎相当快:

import pandas as pd
import numpy as np
from collections import defaultdict

df = pd.DataFrame({'name': ["p1","p1","p2","p2","p2"],
                   'val': [0, 1, np.nan, 1, 0] })

D = {}
[D.setdefault(k, []).append(v) for k, v in zip(df['name'].to_numpy(), df['val'].to_numpy())]
{'p1': [0.0, 1.0], 'p2': [nan, 1.0, 0.0]}

一点性能测试:

import timeit
def method1(df):
  D = {}
  [D.setdefault(k, []).append(v) for k, v in zip(df['name'].to_numpy(), df['val'].to_numpy())]
  return D

def method2(df):
  return {k:list(v) for k,v in df.groupby('name')['val']}

def method3(df):
  d = defaultdict(list)
  for _, row in df.iterrows():
      d[row['name']].append(row['val'])
      
  return dict(d)

t1 = timeit.Timer(lambda: method1(df)) 
t2 = timeit.Timer(lambda: method2(df)) 
t3 = timeit.Timer(lambda: method3(df)) 

print(t1.timeit(5000))
print(t2.timeit(5000))
print(t3.timeit(5000))
0.11856656800046039
4.548045763000118
2.2259791200003747