更有效的附加数据框的方法
More efficient way of appending dataframe
我运行做了一些测试,发现这里的这段代码效率很低。在日期范围内循环,如果 self.query
在 df
中,则直接附加该行。但我听到很多意见,认为这样追加效率不高,甚至很耗资源。
我的镶木地板有 4 列,有数百万行 - query
phone_count
desktop_count
total
,删除 2 列,这意味着我有 index
、query
和total
然后奇迹发生了。
此代码有效 "fine",但现在我正在征求有经验的用户的意见并可能获得一些提示。
有没有更有效的方法来做同样的事情?也许是元组?
谢谢大家!
for filename in os.listdir(directory):
if filename.endswith(".parquet"):
df = pd.read_parquet(directory).drop(["phone_count","desktop_count"], axis=1)
df.set_index("query", inplace=True)
if self.lowercase == "on":
df.index = df.index.str.lower()
else:
pass
if self.sensitive == "on":
self.datafr = self.datafr.append(df.filter(regex=re.compile(self.query), axis=0))
else:
self.datafr = self.datafr.append(df.filter(regex=re.compile(self.query, re.IGNORECASE), axis=0))
self.datafr = self.datafr.groupby(['query']).sum().sort_values(by='total', ascending=False)
你在每个循环中重复了一些事情:
- 正则表达式模式不需要每次都重新编译
- 重复
DataFrame.append
比 pd.concat([frame1, frame2, ...])
慢
list.append
比 DataFrame.append
快很多
试试这个:
option = re.IGNORECASE if self.lowercase == "on" else 0
pattern = re.compile(self.query, option)
subframes = []
for filename in os.listdir(directory):
if filename.endswith(".parquet"):
df = pd.read_parquet(directory).drop(["phone_count","desktop_count"], axis=1)
df.set_index("query", inplace=True)
# Not sure if this statement is necessary. The regex
# is already IGNORECASE when lowercase == "on"
if self.lowercase == "on":
df.index = df.index.str.lower()
# Multiple list.append
subframes.append(df.filter(pattern, axis=0))
# But a single pd.concat
self.datafr = pd.concat([self.datafr] + subframes)
我运行做了一些测试,发现这里的这段代码效率很低。在日期范围内循环,如果 self.query
在 df
中,则直接附加该行。但我听到很多意见,认为这样追加效率不高,甚至很耗资源。
我的镶木地板有 4 列,有数百万行 - query
phone_count
desktop_count
total
,删除 2 列,这意味着我有 index
、query
和total
然后奇迹发生了。
此代码有效 "fine",但现在我正在征求有经验的用户的意见并可能获得一些提示。
有没有更有效的方法来做同样的事情?也许是元组?
谢谢大家!
for filename in os.listdir(directory):
if filename.endswith(".parquet"):
df = pd.read_parquet(directory).drop(["phone_count","desktop_count"], axis=1)
df.set_index("query", inplace=True)
if self.lowercase == "on":
df.index = df.index.str.lower()
else:
pass
if self.sensitive == "on":
self.datafr = self.datafr.append(df.filter(regex=re.compile(self.query), axis=0))
else:
self.datafr = self.datafr.append(df.filter(regex=re.compile(self.query, re.IGNORECASE), axis=0))
self.datafr = self.datafr.groupby(['query']).sum().sort_values(by='total', ascending=False)
你在每个循环中重复了一些事情:
- 正则表达式模式不需要每次都重新编译
- 重复
DataFrame.append
比pd.concat([frame1, frame2, ...])
慢
list.append
比DataFrame.append
快很多
试试这个:
option = re.IGNORECASE if self.lowercase == "on" else 0
pattern = re.compile(self.query, option)
subframes = []
for filename in os.listdir(directory):
if filename.endswith(".parquet"):
df = pd.read_parquet(directory).drop(["phone_count","desktop_count"], axis=1)
df.set_index("query", inplace=True)
# Not sure if this statement is necessary. The regex
# is already IGNORECASE when lowercase == "on"
if self.lowercase == "on":
df.index = df.index.str.lower()
# Multiple list.append
subframes.append(df.filter(pattern, axis=0))
# But a single pd.concat
self.datafr = pd.concat([self.datafr] + subframes)