gpt4 book ai didi

python - Pandas ,根据列值的唯一子集附加列

转载 作者:太空宇宙 更新时间:2023-11-04 03:12:33 25 4
gpt4 key购买 nike

我有一个包含很多行的数据框。我正在使用自定义函数生成的数据附加一列,如下所示:

import numpy

df['new_column'] = numpy.vectorize(fx)(df['col_a'], df['col_b'])
# takes 180964.377 ms

它工作正常,我想做的是加快它的速度。实际上只有一小部分 col_acol_b 的独特组合。许多迭代是多余的。我在想也许 pandas 会自己解决这个问题,但我认为情况并非如此。考虑一下:

print len(df.index) #prints 127255
df_unique = df.copy().drop_duplicates(['col_a', 'col_b'])
print len(df_unique.index) #prints 9834

我还通过运行此命令说服自己可能会加速:

df_unique['new_column'] = numpy.vectorize(fx)(df_unique['col_a'], df_unique['col_b'])
# takes 14611.357 ms

由于有很多冗余数据,我想做的是更新大数据帧(df 127255 行)但只需要运行 fx 函数最少次数(9834次)。这是因为 col_acol_b 的所有重复行。当然这意味着 df 中会有多行 col_acol_b 具有相同的值,但是没关系,另一个df 的列不同,使每一行都是唯一的。

在我创建一个正常的迭代 for 循环以遍历 df_unique 数据帧并对 df 进行条件更新之前,我想问一下是否有更“Pythonic”的"进行这种更新的巧妙方式。非常感谢。

**更新**

我创建了上面提到的简单 for 循环,如下所示:

df = ...
df_unique = df.copy().drop_duplicates(['col_a', 'col_b'])
df_unique['new_column'] = np.vectorize(fx)(df_unique['col_a'], df_unique['col_b'])
for index, row in df_unique.iterrows():
df.loc[(df['col_a'] == row['col_a']) & (df['col_b'] == row['col_b']),'new_column'] = row['new_column']
# takes 165971.890

因此使用这个 for 循环可能会有轻微的性能提升,但远不及我预期的那样。

仅供引用

这是fx 函数。它查询 mysql 数据库。

def fx(d):
exp_date = datetime.strptime(d.col_a, '%m/%d/%Y')
if exp_date.weekday() == 5:
exp_date -= timedelta(days=1)

p = pandas.read_sql("select stat from table where a = '%s' and b_date = '%s';" % (d.col_a,exp_date.strftime('%Y-%m-%d')),engine)
if len(p.index) == 0:
return None
else:
return p.iloc[0].close

最佳答案

更新:

如果您可以设法将属于 table 表的三列 ['stat','a','b_date'] 读入 tab DF 然后你可以像这样合并它:

tab = pd.read_sql('select stat,a,b_date from table', engine)
df.merge(tab, left_on=[...], right_on=[...], how='left')

旧答案:

您可以将预先计算的 df_unique DF 与原始 df DF 合并/合并:

df['new_column'] = df.merge(df_unique, on=['col_a','col_b'], how='left')['new_column']

关于python - Pandas ,根据列值的唯一子集附加列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37527401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com