Fastest/best 从具有相同 df 长度的 numpy 数组字典向 pandas 数据框添加列的方法?
Fastest/best way to add columns to a pandas dataframe from a dict of numpy arrays with the same df length?
可能是一个简单的问题,我已经搜索过但找不到解决方案。
我的代码是这样的
data_df = pd.DataFrame([
['2012-02-22', '3', 'a', 6],
['2012-02-23', '3.2', 'g', 8],
['2012-02-24', '5.2', 'l', 2],
['2012-02-25', '1.4', 'i', 4]],
columns=['date', '1', '2', '3'])
dict_a = {
'a': np.array([False, True, False, False], dtype='bool'),
'b': np.array([True, True, False, False], dtype='bool'),
'c': np.array([False, True, True, False], dtype='bool'),
}
而且我想要一个这样的 df
1 2 3 a b c
date
2012-02-22 3 a 6 False True False
2012-02-23 3.2 g 8 True True True
2012-02-24 5.2 l 2 False False True
2012-02-25 1.4 i 4 False False False
到目前为止,我发现的最好方法是这个,但对我来说似乎很老套
data_df = data_df.set_index('date')
df_dict = pd.DataFrame.from_dict(dict_a)
df_dict['date'] = data_df.index
df_dict = df_dict.set_index('date')
df_new = pd.merge(data_df, df_dict, left_index=True, right_index=True)
有faster/better实现的方法吗?
编辑:结果
感谢大家的快速回复。
我做了一些时间安排,(到目前为止)看起来像给定的数据一样,最快的是第一个。
def df_new1():
data_df = pd.DataFrame([
['2012-02-22', '3', 'a', 6],
['2012-02-23', '3.2', 'g', 8],
['2012-02-24', '5.2', 'l', 2],
['2012-02-25', '1.4', 'i', 4]],
columns=['date', '1', '2', '3'])
dict_a = {
'a1': np.array([False, True, False, False], dtype='bool'),
'b1': np.array([True, True, False, False], dtype='bool'),
'c1': np.array([False, True, True, False], dtype='bool'),
}
return pd.concat((data_df, pd.DataFrame(dict_a)), axis=1).set_index('date')
def df_new2():
data_df = pd.DataFrame([
['2012-02-22', '3', 'a', 6],
['2012-02-23', '3.2', 'g', 8],
['2012-02-24', '5.2', 'l', 2],
['2012-02-25', '1.4', 'i', 4]],
columns=['date', '1', '2', '3'])
dict_a = {
'a1': np.array([False, True, False, False], dtype='bool'),
'b1': np.array([True, True, False, False], dtype='bool'),
'c1': np.array([False, True, True, False], dtype='bool'),
}
return data_df.assign(**dict_a).set_index('date')
def df_new3():
data_df = pd.DataFrame([
['2012-02-22', '3', 'a', 6],
['2012-02-23', '3.2', 'g', 8],
['2012-02-24', '5.2', 'l', 2],
['2012-02-25', '1.4', 'i', 4]],
columns=['date', '1', '2', '3'])
dict_a = {
'a1': np.array([False, True, False, False], dtype='bool'),
'b1': np.array([True, True, False, False], dtype='bool'),
'c1': np.array([False, True, True, False], dtype='bool'),
}
return data_df.join(pd.DataFrame(dict_a)).set_index('date')
def df_new4():
data_df = pd.DataFrame([
['2012-02-22', '3', 'a', 6],
['2012-02-23', '3.2', 'g', 8],
['2012-02-24', '5.2', 'l', 2],
['2012-02-25', '1.4', 'i', 4]],
columns=['date', '1', '2', '3'])
dict_a = {
'a1': np.array([False, True, False, False], dtype='bool'),
'b1': np.array([True, True, False, False], dtype='bool'),
'c1': np.array([False, True, True, False], dtype='bool'),
}
for keys in dict_a:
data_df[keys] = dict_a[keys]
return data_df.set_index('date')
print('df_new1', timeit(df_new1, number=1000))
print('df_new2', timeit(df_new2, number=1000))
print('df_new3', timeit(df_new3, number=1000))
print('df_new4', timeit(df_new4, number=1000))
df_new1 2.0431520210004237
df_new2 2.6708478379987355
df_new3 2.4773063749998983
df_new4 2.910699995998584
为什么不简单:
for keys in dict_a:
data_df[keys]=dict_a[keys]
请注意,dict 中的数据长度必须等于 dataframe 中的数据长度
pd.concat
在 axis=1
上,然后设置索引
pd.concat((data_df,pd.DataFrame(dict_a)),axis=1).set_index("date")
1 2 3 a b c
date
2012-02-22 3 a 6 False True False
2012-02-23 3.2 g 8 True True True
2012-02-24 5.2 l 2 False False True
2012-02-25 1.4 i 4 False False False
尝试 DataFrame.assign
:
data_df.assign(**dict_a)
date 1 2 3 a b c
0 2012-02-22 3 a 6 False True False
1 2012-02-23 3.2 g 8 True True True
2 2012-02-24 5.2 l 2 False False True
3 2012-02-25 1.4 i 4 False False False
使用join
:
data_df.join(pd.DataFrame(dict_a)).set_index('date')
1 2 3 a b c
date
2012-02-22 3 a 6 False True False
2012-02-23 3.2 g 8 True True True
2012-02-24 5.2 l 2 False False True
2012-02-25 1.4 i 4 False False False
可能是一个简单的问题,我已经搜索过但找不到解决方案。
我的代码是这样的
data_df = pd.DataFrame([
['2012-02-22', '3', 'a', 6],
['2012-02-23', '3.2', 'g', 8],
['2012-02-24', '5.2', 'l', 2],
['2012-02-25', '1.4', 'i', 4]],
columns=['date', '1', '2', '3'])
dict_a = {
'a': np.array([False, True, False, False], dtype='bool'),
'b': np.array([True, True, False, False], dtype='bool'),
'c': np.array([False, True, True, False], dtype='bool'),
}
而且我想要一个这样的 df
1 2 3 a b c
date
2012-02-22 3 a 6 False True False
2012-02-23 3.2 g 8 True True True
2012-02-24 5.2 l 2 False False True
2012-02-25 1.4 i 4 False False False
到目前为止,我发现的最好方法是这个,但对我来说似乎很老套
data_df = data_df.set_index('date')
df_dict = pd.DataFrame.from_dict(dict_a)
df_dict['date'] = data_df.index
df_dict = df_dict.set_index('date')
df_new = pd.merge(data_df, df_dict, left_index=True, right_index=True)
有faster/better实现的方法吗?
编辑:结果
感谢大家的快速回复。 我做了一些时间安排,(到目前为止)看起来像给定的数据一样,最快的是第一个。
def df_new1():
data_df = pd.DataFrame([
['2012-02-22', '3', 'a', 6],
['2012-02-23', '3.2', 'g', 8],
['2012-02-24', '5.2', 'l', 2],
['2012-02-25', '1.4', 'i', 4]],
columns=['date', '1', '2', '3'])
dict_a = {
'a1': np.array([False, True, False, False], dtype='bool'),
'b1': np.array([True, True, False, False], dtype='bool'),
'c1': np.array([False, True, True, False], dtype='bool'),
}
return pd.concat((data_df, pd.DataFrame(dict_a)), axis=1).set_index('date')
def df_new2():
data_df = pd.DataFrame([
['2012-02-22', '3', 'a', 6],
['2012-02-23', '3.2', 'g', 8],
['2012-02-24', '5.2', 'l', 2],
['2012-02-25', '1.4', 'i', 4]],
columns=['date', '1', '2', '3'])
dict_a = {
'a1': np.array([False, True, False, False], dtype='bool'),
'b1': np.array([True, True, False, False], dtype='bool'),
'c1': np.array([False, True, True, False], dtype='bool'),
}
return data_df.assign(**dict_a).set_index('date')
def df_new3():
data_df = pd.DataFrame([
['2012-02-22', '3', 'a', 6],
['2012-02-23', '3.2', 'g', 8],
['2012-02-24', '5.2', 'l', 2],
['2012-02-25', '1.4', 'i', 4]],
columns=['date', '1', '2', '3'])
dict_a = {
'a1': np.array([False, True, False, False], dtype='bool'),
'b1': np.array([True, True, False, False], dtype='bool'),
'c1': np.array([False, True, True, False], dtype='bool'),
}
return data_df.join(pd.DataFrame(dict_a)).set_index('date')
def df_new4():
data_df = pd.DataFrame([
['2012-02-22', '3', 'a', 6],
['2012-02-23', '3.2', 'g', 8],
['2012-02-24', '5.2', 'l', 2],
['2012-02-25', '1.4', 'i', 4]],
columns=['date', '1', '2', '3'])
dict_a = {
'a1': np.array([False, True, False, False], dtype='bool'),
'b1': np.array([True, True, False, False], dtype='bool'),
'c1': np.array([False, True, True, False], dtype='bool'),
}
for keys in dict_a:
data_df[keys] = dict_a[keys]
return data_df.set_index('date')
print('df_new1', timeit(df_new1, number=1000))
print('df_new2', timeit(df_new2, number=1000))
print('df_new3', timeit(df_new3, number=1000))
print('df_new4', timeit(df_new4, number=1000))
df_new1 2.0431520210004237
df_new2 2.6708478379987355
df_new3 2.4773063749998983
df_new4 2.910699995998584
为什么不简单:
for keys in dict_a:
data_df[keys]=dict_a[keys]
请注意,dict 中的数据长度必须等于 dataframe 中的数据长度
pd.concat
在 axis=1
上,然后设置索引
pd.concat((data_df,pd.DataFrame(dict_a)),axis=1).set_index("date")
1 2 3 a b c
date
2012-02-22 3 a 6 False True False
2012-02-23 3.2 g 8 True True True
2012-02-24 5.2 l 2 False False True
2012-02-25 1.4 i 4 False False False
尝试 DataFrame.assign
:
data_df.assign(**dict_a)
date 1 2 3 a b c
0 2012-02-22 3 a 6 False True False
1 2012-02-23 3.2 g 8 True True True
2 2012-02-24 5.2 l 2 False False True
3 2012-02-25 1.4 i 4 False False False
使用join
:
data_df.join(pd.DataFrame(dict_a)).set_index('date')
1 2 3 a b c
date
2012-02-22 3 a 6 False True False
2012-02-23 3.2 g 8 True True True
2012-02-24 5.2 l 2 False False True
2012-02-25 1.4 i 4 False False False