[英]Split timestamp column into two new columns in CSV using python and pandas
[英]How to split up two CSV file columns in a new column, showing matches in pandas, using dataframes?
我正在嘗試清理CSV
文件數據集,然后再使用它制作幾個虛線圖。
其中一列是UNITMEASURENAME
,包括:
Thousand Barrels per day (kb/d)
Thousand Kilolitres (kl)
Thousand Barrels per day (kb/d)
Thousand Kilolitres (kl)
Conversion factor barrels/ktons
Conversion factor barrels/ktons
Thousand Barrels (kbbl)
另一列包含每個對應rows
的值。
還有一個國家和一個數據列。
我需要做的是將UNITMEASURENAME
拆分為單獨的列,從帶有數字的列中獲取值。
df.pivot_table
會起作用嗎?
我在pandas
中完成了以下操作,但我認為它不會在 Dash 中用於 plotly 圖:
TK = df.loc[df['UNITMEASURENAME']=='Thousand Kilolitres (kl)']
IN = df.loc[df['COUNTRYNAME']=='INDIA']
這並不是在實際的 CSV 文件中創建新列。
TK = df.loc[df['UNITMEASURENAME']=='Thousand Kilolitres (kl)']
IN = df.loc[df['COUNTRYNAME']=='INDIA']
我想要新的列,然后我將與它們一起保存實際的 CSV 文件。
{'Unnamed: 0': {0: 0, 1: 1, 2: 2, 3: 3, 4: 4},
'Year': {0: 2018, 1: 2018, 2: 2018, 3: 2018, 4: 2018},
'Month': {0: 3, 1: 3, 2: 3, 3: 4, 4: 4},
'OBSVALUE': {0: 7323.0, 1: 9907.0, 2: 48827.7847, 3: 9868.0, 4: 47066.6794},
'COUNTRYNAME': {0: 'SAUDI ARABIA',
1: 'SAUDI ARABIA',
2: 'SAUDI ARABIA',
3: 'SAUDI ARABIA',
4: 'SAUDI ARABIA'},
'UNITMEASURENAME': {0: 'Conversion factor barrels/ktons',
1: 'Thousand Barrels per day (kb/d)',
2: 'Thousand Kilolitres (kl)',
3: 'Thousand Barrels per day (kb/d)',
4: 'Thousand Kilolitres (kl)'},
'alternate_date': {0: '2018-03-01',
1: '2018-03-01',
2: '2018-03-01',
3: '2018-04-01',
4: '2018-04-01'}}
Header 用於 CSV 文件:
Unnamed: 0 Year Month OBSVALUE COUNTRYNAME UNITMEASURENAME alternate_date
0 0 2018 3 7323.0000 SAUDI ARABIA Conversion factor barrels/ktons 2018-03-01
1 1 2018 3 9907.0000 SAUDI ARABIA Thousand Barrels per day (kb/d) 2018-03-01
2 2 2018 3 48827.7847 SAUDI ARABIA Thousand Kilolitres (kl) 2018-03-01
3 3 2018 4 9868.0000 SAUDI ARABIA Thousand Barrels per day (kb/d) 2018-04-01
4 4 2018 4 47066.6794 SAUDI ARABIA Thousand Kilolitres (kl) 2018-04-01
似乎您有一個多列鍵(年、月、國家/地區名稱,可能還有備用日期),這很好,但它會使旋轉變得困難/危險。所以,我將簡單地給您一些代碼來創建基於新列的在那一列中的值。
首先,我喜歡復制 dataframe 以免丟失原始數據
dfc = df.copy()
現在,讓我們獲取該列所有值的唯一列表
vals = dfc['UNITMEASURENAME'].values
vals = np.unique(vals)
現在讓我們為每個值創建一個新列
for val in vals:
dfc[val] = dfc.apply(lambda x: x['OBSVALUE'] if x['UNITMEASURENAME'] == val else None , axis = 1)
如果 lambda 功能太混亂:
dfc = df.copy()
vals = dfc['UNITMEASURENAME'].values
vals = np.unique(vals)
def fun(row):
if row['UNITMEASURENAME'] == val:
return row['OBSVALUE']
else:
return None
for val in vals:
dfc[val] = dfc.apply(fun, axis = 1)
我測試了這段代碼。
我認為您可以使用pivot
方法 Pandas DataFrame 使用分類值創建新列。
df = ... # your dataframe
# We keep 'Unnamed: 0' column as index for later when we merge df and df2
df2 = df.pivot(index='Unnamed: 0', columns='UNITMEASURENAME', values=['OBSVALUE'])
# df2 is a MultiIndex dataframe.. So we access the level needed and then reset_index
df2 = df2['OBSVALUE'].reset_index()
現在您可以將其合並到原始 dataframe 以保留其他列以供您分析
final_df = pd.merge(df, df2, on='Unnamed: 0')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.