遍历 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
列为 key
,val
列为 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
我正在尝试使用 pandas
DataFrame 创建字典。
import pandas as pd
df = pd.DataFrame({'name': ["p1","p1","p2","p2","p2"],
'val': [0, 1, np.nan, 1, 0] })
我想创建一个字典,其中 name
列为 key
,val
列为 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