在 Python 中搜索 DataFrame 的最有效方法
Most efficient way to search over a DataFrame in Python
我有一个包含这些数据的 DataFrame :
df = pd.DataFrame({
'id' : ['a', 'a', 'b', 'b', 'c', 'c'],
'alias' : ['value'+str(i) for i in range(6)],
'source' : ['src1', 'src2', 'src1', 'src2', 'src1', 'src3']
})
print(df)
输出:
id alias source
0 a value0 src1
1 a value1 src2
2 b value2 src1
3 b value3 src2
4 c value4 src1
5 c value5 src3
我想更改数据框的结构以获得如下内容:
src1 src2 src3
a value0 value1 None
b value2 value3 None
c value4 None value5
所以为了处理这个任务,我做了这个函数:
def process_aliases(df):
sources = set(df['source'])
indexes = list(set(df['id']))
cols = {source:[] for source in sources}
for index in indexes:
subdf = df[df['id']==index]
for source in sources:
alias = subdf[df['source'] == source]['alias']
cols[source].append(alias.iloc[0].strip() if len(alias) == 1 else None)
return pd.DataFrame(cols, index=indexes)
我的问题是我的数据框包含超过 1 000 000 行。所以这个函数需要太多时间来处理。使用 Google Colab 的执行时间超过 1 小时。
我不知道我的功能是否是执行此操作的最佳方式。所以,我寻求帮助。
完成此任务的最佳方法是什么?
或者,通过 DataFrame 搜索元素的最快方法是什么?
我相信你想要pivot
:
import pandas as pd
df = pd.DataFrame({
'id' : ['a', 'a', 'b', 'b', 'c', 'c'],
'alias' : ['value'+str(i) for i in range(6)],
'source' : ['src1', 'src2', 'src1', 'src2', 'src1', 'src3']
})
print(df.pivot(index='id', columns='source'))
alias
source src1 src2 src3
id
a value0 value1 NaN
b value2 value3 NaN
c value4 NaN value5
如果您出于某种原因严格要求 None
而不是 NaN
,您可以这样做:
import numpy as np
print(df.pivot(index='id', columns='source').replace([np.nan], [None]))
alias
source src1 src2 src3
id
a value0 value1 None
b value2 value3 None
c value4 None value5
我有一个包含这些数据的 DataFrame :
df = pd.DataFrame({
'id' : ['a', 'a', 'b', 'b', 'c', 'c'],
'alias' : ['value'+str(i) for i in range(6)],
'source' : ['src1', 'src2', 'src1', 'src2', 'src1', 'src3']
})
print(df)
输出:
id alias source
0 a value0 src1
1 a value1 src2
2 b value2 src1
3 b value3 src2
4 c value4 src1
5 c value5 src3
我想更改数据框的结构以获得如下内容:
src1 src2 src3
a value0 value1 None
b value2 value3 None
c value4 None value5
所以为了处理这个任务,我做了这个函数:
def process_aliases(df):
sources = set(df['source'])
indexes = list(set(df['id']))
cols = {source:[] for source in sources}
for index in indexes:
subdf = df[df['id']==index]
for source in sources:
alias = subdf[df['source'] == source]['alias']
cols[source].append(alias.iloc[0].strip() if len(alias) == 1 else None)
return pd.DataFrame(cols, index=indexes)
我的问题是我的数据框包含超过 1 000 000 行。所以这个函数需要太多时间来处理。使用 Google Colab 的执行时间超过 1 小时。
我不知道我的功能是否是执行此操作的最佳方式。所以,我寻求帮助。
完成此任务的最佳方法是什么? 或者,通过 DataFrame 搜索元素的最快方法是什么?
我相信你想要pivot
:
import pandas as pd
df = pd.DataFrame({
'id' : ['a', 'a', 'b', 'b', 'c', 'c'],
'alias' : ['value'+str(i) for i in range(6)],
'source' : ['src1', 'src2', 'src1', 'src2', 'src1', 'src3']
})
print(df.pivot(index='id', columns='source'))
alias
source src1 src2 src3
id
a value0 value1 NaN
b value2 value3 NaN
c value4 NaN value5
如果您出于某种原因严格要求 None
而不是 NaN
,您可以这样做:
import numpy as np
print(df.pivot(index='id', columns='source').replace([np.nan], [None]))
alias
source src1 src2 src3
id
a value0 value1 None
b value2 value3 None
c value4 None value5