我有一個帶有此類值的資料框(來自其他地方 - 不幸的是,我無法更改源資料)。
| 商店/日期 | 銷售量 |
|---|---|
| 店鋪 1 | 南 |
| 10/15/21 | 6712 |
| 10/16/21 | 7108 |
| 10/17/21 | 4120 |
| 商店2 | 南 |
| 10/15/21 | 5123 |
| 10/16/21 | 9012 |
| 10/17/21 | 4241 |
我想把它變成以下資料框:
| 店鋪 | 日期 | 銷售量 |
|---|---|---|
| 店鋪 1 | 10/15/21 | 6712 |
| 店鋪 1 | 10/16/21 | 7108 |
| 店鋪 1 | 10/17/21 | 4120 |
| 商店2 | 10/15/21 | 5123 |
| 商店2 | 10/16/21 | 9012 |
| 商店2 | 10/17/21 | 4241 |
我應該注意,Stores 在前面有一個唯一的字串(例如在這個例子中的 'Store'),所以我已經有了一個與日期分開的所有商店的串列。(如果你也有更好的方法來做那部分,那就太好了。)
我想到的一種方法是遍歷整個 DF,讓迭代器成為當前存盤,并用它創建一個新的資料幀,但我知道回圈不是首選(并且此資料有數百萬行,所以速度不快) .
有沒有好的熊貓方式來做到這一點?
謝謝!
這是一些生成該示例 df 的代碼:
import pandas as pd
import numpy as np
df = pd.DataFrame(columns = ['Store/Date','Sales'],
data = [['Store1',np.nan],
['10/15/21',6712],
['10/16/21',7108],
['10/17/21',4120],
['Store2',np.nan],
['10/15/21',5123],
['10/16/21',9012],
['10/17/21',4241]])
stores = df[df['Store/Date'].str.contains('Store', na = False)]
stores = stores.iloc[:,0]
uj5u.com熱心網友回復:
使用DataFrame.insert用于與第一位置新列Series.where和轉發填充缺失值,然后取出用倒置掩模行boolean indexing和最后使用rename:
m = df['Store/Date'].str.contains('Store', na = False)
df.insert(0, 'Store', df['Store/Date'].where(m).ffill())
df = df[~m].rename(columns={'Store/Date':'Date'})
print (df)
Store Date Sales
1 Store1 10/15/21 6712.0
2 Store1 10/16/21 7108.0
3 Store1 10/17/21 4120.0
5 Store2 10/15/21 5123.0
6 Store2 10/16/21 9012.0
7 Store2 10/17/21 4241.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/345056.html
上一篇:如何提取bs4.element.Tag的第一個元素?
下一篇:提高pandas應用函式性能
