我想转换数据。 例如,我想在包含°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)
答案 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级标题