在第一行应用带有条件的功能

时间:2015-12-23 10:22:18

标签: python pandas

我想转换数据。 例如,我想在包含°C数据的每列上应用(lambda x:x + 273.15)。

一组数据:

TIME    Temp     Pressure
 s       °C        Pa
 0       20        10^5
 1       30        10^5

TIME    Temp     Pressure
 s       °C        Pa
 0      293.5        10^5
 1      303.5        10^5

Data=pd.DataFrame({'Time':['s',0.,1.],
               'Temp':['°C',20.,30.],
               'Pressure':['Pa',10^5,10^5]})

什么是最好的解决方案? 我只设法将Dataframe拆分为只有一个单元的Dataframes,处理每个Dataframe并将它们连接起来。 我想有更好的方法来做到这一点:o

我也试过这个:

def test(x):
    try :
        x=x+273.15
    except:
        x
    return x

def C_to_K(Col):
    if Col[0]=='°C':
        Col=Col.map(lambda x: test(x))


Data=Data.apply(C_to_K,axis=0 )

编辑:使用eumiro解决方案

import pandas as pd

Data=pd.DataFrame({'Time':['s',0.,1.],
                   'Temp':['°C',20.,30.],
                   'Pressure':['Pa',10^5,10^5]})

ListColName=[]
for ColName in Data.columns:
    ListColName.append(ColName)

ListUnit=[]
for Unit in Data.iloc[0]:
    ListUnit.append(Unit)

ListMetaData=[]
for i in range(len(ListColName)):
    tampo=ListColName[i]+" ["+ListUnit[i]+"]"
    ListMetaData.append(tampo)


Data.columns=ListMetaData
Data=Data.drop(Data.index[0])

for col in Data.columns[:]:
    if col.endswith('[°C]'):
        Data[col[:-5] + '[K]'] = Data[col] + 273.15
        Data=Data.drop(col,1)

编辑:如果直接从csv文件中读取其他解决方案

Data=pd.read_csv('Test.csv', header=[0,1])

for col in Data.columns[:]:
if col[1]=='°C':
    Data[col[0],'K'] = Data[col] + 273.15
    Data=Data.drop(col,1)

2 个答案:

答案 0 :(得分:0)

将摄氏度列增加273.15(x = x + 273.15)使其成为开尔文列而不更新描述,因此在某些时候您的数据不一致。

最好的解决方案是不要将单位放入第一行真实数据中。您是否无法为列Temp [°C]Temp/°C命名并测试列的名称?

df = pd.DataFrame({'Time [s]':[0.,1.],
                   'Temp [°C]':[20.,30.],
                   'Pressure [Pa]':[10^5,10^5]})
for col in df.columns[:]:
    if col.endswith('[°C]'):
        df[col[:-5] + '[K]'] = df[col] + 273.15

df现在是:

   Pressure [Pa]  Temp [°C]  Time [s]   Temp [K]
0             15         20         0     293.15
1             15         30         1     303.15

答案 1 :(得分:0)

将单位存储在第一行并不是一个好主意。你可以为它做2级标题,然后像通常的数字列一样使用它们。首先,您需要执行2级标题,然后删除第1行并转换reset_index以使其从0开始(或者如果您从1开始索引就可以省略它):

In [860]: Databis
Out[860]: 
  Pressure Temp Tempbis Time
0       Pa   °C       K    s
1       15   20     300    0
2       15   30     500    1


Databis.columns = pd.MultiIndex.from_tuples(list(zip(Databis.columns, Databis.iloc[0])))
Databis = Databis.drop(Databis.index[0]).reset_index(drop=True)

In [862]: Databis
Out[862]: 
  Pressure Temp Tempbis Time
        Pa   °C       K    s
0       15   20     300    0
1       15   30     500    1

Databis.Temp = Databis.Temp + 273.15

In [864]: Databis
Out[864]: 
  Pressure    Temp Tempbis Time
        Pa      °C       K    s
0       15  293.15     300    0
1       15  303.15     500    1

注意:如果您正在使用read_csv函数阅读数据框,则可以传递header=[0,1]。然后你将有2级标题