给定行索引,有没有办法在 Pandas DataFrame 中合并行?
Is there a way to combine rows in a Pandas DataFrame, given the row index?
我希望将第 2 行与第 0 行合并,以便行的单位是列 header 的一部分,而不是在数据点之后。数据来自这种格式的 .csv 文件,但如果单位在 header 中,使用起来会容易得多。该单位并不总是“mi/h”,并且可以在任何给定的参考文件中更改。这些部分是从包含许多不同格式表格的较大 .csv 文件中提取的。我的最终目标是将每个部分单独导出到它自己的 .csv 文件中。这已经在工作,但我希望如上所述调整数据,然后继续将其导出到自己的 .csv 文件。
0 Avg Wind Speed Gust Speed Min Wind Speed
1 5.26 10.74 1.34
2 mi/h mi/h mi/h
理想情况下,输出如下所示:
0 Avg Wind Speed (mi/h) Gust Speed (mi/h) Min Wind Speed (mi/h)
1 5.26 10.74 1.34
df.columns=[c+"("+str(df.loc[2,c])+")" for c in df.columns]
通过添加第二行和相应列的值(转换为字符串)重命名所有列。
df.loc[0,:]=[str(df.loc[0,c])+str(df.loc[2,c]) for c in df.columns ]
此解决方案编辑的是第一行而不是列,不确定您想要哪一个。
从第 0 行和第 2 行创建一个 df header
import pandas as pd
# given your sample data
data = {0: ['Avg Wind Speed', '5.26', 'mi/h'],
1: ['Gust Speed', '10.74', 'mi/h'],
2: ['Min Wind Speed', '1.34', 'mi/h']}
df = pd.DataFrame(data)
0 1 2
0 Avg Wind Speed Gust Speed Min Wind Speed
1 5.26 10.74 1.34
2 mi/h mi/h mi/h
# create the new header from row 0 and 2
header = (df.iloc[0, :] + ' ('+ df.iloc[2, :] + ')').to_list()
# if there can be whitespace or floats, use the following line for header
header = (df.iloc[0, :].astype(str).str.strip() + ' ('+ df.iloc[2, :].astype(str).str.strip() + ')').to_list()
['Avg Wind Speed (mi/h)', 'Gust Speed (mi/h)', 'Min Wind Speed (mi/h)']
# set as header
df.columns = header
# delete row 0 and 2
df = df.drop(labels=[0, 2])
# final df
Avg Wind Speed (mi/h) Gust Speed (mi/h) Min Wind Speed (mi/h)
1 5.26 10.74 1.34
写入新行 0
# overwrite row 0
df.iloc[0] = header
# delete row 2
df = df.drop(labels=[2])
# final df
0 1 2
0 Avg Wind Speed (mi/h) Gust Speed (mi/h) Min Wind Speed (mi/h)
1 5.26 10.74 1.34
如果正在更新 header 而不是 row0 和 row2
data = {'Avg Wind Speed': ['5.26', 'mi/h'],
'Gust Speed': ['10.74', 'mi/h'],
'Min Wind Speed': ['1.34', 'mi/h']}
df = pd.DataFrame(data)
Avg Wind Speed Gust Speed Min Wind Speed
0 5.26 10.74 1.34
1 mi/h mi/h mi/h
# get values from row 1
row1 = df.iloc[1].tolist()
# update the column headers
df.columns = [f'{c} ({row1[i]})' for i, c in enumerate(df.columns)]
# drop row 1
df = df.drop(labels=[1])
# final df
Avg Wind Speed (mi/h) Gust Speed (mi/h) Min Wind Speed (mi/h)
0 5.26 10.74 1.34
我希望将第 2 行与第 0 行合并,以便行的单位是列 header 的一部分,而不是在数据点之后。数据来自这种格式的 .csv 文件,但如果单位在 header 中,使用起来会容易得多。该单位并不总是“mi/h”,并且可以在任何给定的参考文件中更改。这些部分是从包含许多不同格式表格的较大 .csv 文件中提取的。我的最终目标是将每个部分单独导出到它自己的 .csv 文件中。这已经在工作,但我希望如上所述调整数据,然后继续将其导出到自己的 .csv 文件。
0 Avg Wind Speed Gust Speed Min Wind Speed
1 5.26 10.74 1.34
2 mi/h mi/h mi/h
理想情况下,输出如下所示:
0 Avg Wind Speed (mi/h) Gust Speed (mi/h) Min Wind Speed (mi/h)
1 5.26 10.74 1.34
df.columns=[c+"("+str(df.loc[2,c])+")" for c in df.columns]
通过添加第二行和相应列的值(转换为字符串)重命名所有列。
df.loc[0,:]=[str(df.loc[0,c])+str(df.loc[2,c]) for c in df.columns ]
此解决方案编辑的是第一行而不是列,不确定您想要哪一个。
从第 0 行和第 2 行创建一个 df header
import pandas as pd
# given your sample data
data = {0: ['Avg Wind Speed', '5.26', 'mi/h'],
1: ['Gust Speed', '10.74', 'mi/h'],
2: ['Min Wind Speed', '1.34', 'mi/h']}
df = pd.DataFrame(data)
0 1 2
0 Avg Wind Speed Gust Speed Min Wind Speed
1 5.26 10.74 1.34
2 mi/h mi/h mi/h
# create the new header from row 0 and 2
header = (df.iloc[0, :] + ' ('+ df.iloc[2, :] + ')').to_list()
# if there can be whitespace or floats, use the following line for header
header = (df.iloc[0, :].astype(str).str.strip() + ' ('+ df.iloc[2, :].astype(str).str.strip() + ')').to_list()
['Avg Wind Speed (mi/h)', 'Gust Speed (mi/h)', 'Min Wind Speed (mi/h)']
# set as header
df.columns = header
# delete row 0 and 2
df = df.drop(labels=[0, 2])
# final df
Avg Wind Speed (mi/h) Gust Speed (mi/h) Min Wind Speed (mi/h)
1 5.26 10.74 1.34
写入新行 0
# overwrite row 0
df.iloc[0] = header
# delete row 2
df = df.drop(labels=[2])
# final df
0 1 2
0 Avg Wind Speed (mi/h) Gust Speed (mi/h) Min Wind Speed (mi/h)
1 5.26 10.74 1.34
如果正在更新 header 而不是 row0 和 row2
data = {'Avg Wind Speed': ['5.26', 'mi/h'],
'Gust Speed': ['10.74', 'mi/h'],
'Min Wind Speed': ['1.34', 'mi/h']}
df = pd.DataFrame(data)
Avg Wind Speed Gust Speed Min Wind Speed
0 5.26 10.74 1.34
1 mi/h mi/h mi/h
# get values from row 1
row1 = df.iloc[1].tolist()
# update the column headers
df.columns = [f'{c} ({row1[i]})' for i, c in enumerate(df.columns)]
# drop row 1
df = df.drop(labels=[1])
# final df
Avg Wind Speed (mi/h) Gust Speed (mi/h) Min Wind Speed (mi/h)
0 5.26 10.74 1.34