如何使用数据帧在一个新列中拆分两个CSV文件列,在Pandas中显示匹配项?

2024-05-23 17:53:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试清理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 graph:

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'}}

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

Tags: 文件csvdfkbfactorthousanddaybarrels
2条回答

似乎您有一个多列键(年、月、国家名称,也许还有备用的\日期),这很好,但这会使数据透视变得困难/很危险。所以呢,我将简单地为您提供一些代码,以便根据该列中的值创建新列。你知道吗

首先,我喜欢复制数据帧,这样就不会丢失原始数据

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)

我测试了这个代码。你知道吗

我认为可以使用Pandas DataFrame的pivot方法使用分类值创建新列。你知道吗

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()

现在您可以将其合并到原始数据帧中,以保留其他列以供分析

final_df = pd.merge(df, df2, on='Unnamed: 0')

相关问题 更多 >