我正在撰寫一個 python 程式,它將根據列值將大型資料幀(數萬行)決議為較小的資料幀,并且它需要相當高效,因為用戶可以更改他們分解資料幀的方式,并且我希望輸出動態更新。
示例輸入:
| ID | Column_1 | Column_2 |
|---|---|---|
| 1 | 十月 | 10000 美元 |
| 1 | 十二月 | 9000 美元 |
| 2 | 十月 | 3400 美元 |
| 3 | 十二月 | 20000 美元 |
| 2 | 十一月 | 9000 美元 |
| 1 | 十一月 | 15000 美元 |
示例輸出:
| ID | Column_1 | Column_2 |
|---|---|---|
| 1 | 十月 | 10000 美元 |
| 1 | 十一月 | 15000 美元 |
| 1 | 十二月 | 9000 美元 |
| ID | Column_1 | Column_2 |
|---|---|---|
| 2 | 十月 | 3400 美元 |
| 2 | 十一月 | 9000 美元 |
| ID | Column_1 | Column_2 |
|---|---|---|
| 3 | 十二月 | 20000 美元 |
在我看來,天真的方法是做這樣的事情:
for id in list(df['id'].unique()):
filtered_df = df[df['id'] == id]
但我相信這會比必要的次數更多地回圈相同的資料,這是低效的。有沒有一種快速的方法來做到這一點?
更新
做了一點軟體飆車。結果如下:
%%timeit
[df.loc[df.id.eq(i)] for i in df.id.unique()]
每個回圈 9.96 毫秒 ± 1.26 毫秒(平均值 ± 標準偏差。7 次運行,每次 100 次回圈)
%%timeit
dflist=[]
dflist2=[]
for k,v in df.groupby(['id']):
var='id' str(k)
dflist.append(var)
globals()[var] = v
dflist2.append(v)
每個回圈 1.28 毫秒 ± 92.2 微秒(平均值 ± 標準偏差。7 次運行,每次 1,000 次回圈)
%%timeit
d = {id:df[df.id==id] for id in df.id.unique()}
每個回圈 9.19 毫秒 ± 885 微秒(平均值 ± 標準偏差。7 次運行,每次 100 次回圈)
有誰知道為什么第二種解決方案會快得多?
uj5u.com熱心網友回復:
這是一種方法
# create lists to hold name and the trimmed data from df
dflist=[]
dflist2=[]
for k,v in df.groupby(['id']):
var='id' str(k)
# append dataframe name in a list
dflist.append(var)
# create a DF with a variable name
globals()[var] = v
# append dataframe in a list
dflist2.append(v)
# to list all the dataframe created
>>> dflist
['id1', 'id2', 'id3']
# accessing a dataframe
>>> id1
id Column_1 Column_2
0 1 Oct 10000$
1 1 Dec 9000$
5 1 Nov 15000$
>> dflist2
[ id Column_1 Column_2
0 1 Oct 10000$
1 1 Dec 9000$
5 1 Nov 15000$,
id Column_1 Column_2
2 2 Oct 3400$
4 2 Nov 9000$,
id Column_1 Column_2
3 3 Dec 20000$]
uj5u.com熱心網友回復:
一個可能的解決方案:
[df.loc[df.id.eq(i)] for i in df.id.unique()]
輸出:
[
id Column_1 Column_2
0 1 Oct 10000$
1 1 Dec 9000$
5 1 Nov 15000$,
id Column_1 Column_2
2 2 Oct 3400$
4 2 Nov 9000$,
id Column_1 Column_2
3 3 Dec 20000$
]
uj5u.com熱心網友回復:
您可以為此使用字典理解:
輸入資料框df:
d = {id:df[df.id==id] for id in df.id.unique()}
用于d[1]獲取 ID 的(子)資料框1。
用于d[2]獲取 ID 的(子)資料框2。
用于d[3]獲取 ID 的(子)資料框3。
d[2]
結果:
id Column_1 Column_2
2 2 Oct 3400
4 2 Nov 9000
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/522502.html
標籤:Python熊猫表现
