pandas 合并一个嵌套框架的前两个嵌套并编辑结果

w46czmvw  于 2023-10-14  发布在  其他
关注(0)|答案(2)|浏览(116)

我有一个dataframe:

df = pd.DataFrame({ 
    '0': ['FY18', 'Q1', 1500, 1200, 950, 2200], 
    '1': ['FY18', 'Q2', 2340, 1234, 2000, 1230],
    '2': ['FY18', 'Q3', 2130, 2200, 2190, 2210],   
    '3': ['FY18', 'YearTotal', 1000, 1900, 1500, 1800], 
})

我想合并的顶部两行的结构,使其成为索引
我试过:

# Merge the top two rows into a single row 
merged_row = pd.concat([df.iloc[0], df.iloc[1]], axis=1)

# Transpose the merged row to make it a single row with all columns 
merged_row = merged_row.T

# Replace the first row of the DataFrame with the merged row 
df.iloc[0] = merged_row

但是我得到了一个错误

ValueError: Incompatible indexer with DataFrame

此外,我想编辑的标题,使其扭转'Q1'到'1Q'。当列显示“YearTotal "时,还删除”YearTotal“并仅保留”FY18“。最终输出可能如下所示:

df = pd.DataFrame({ 
    '0': ['1Q18', 1500, 1200, 950, 2200], 
    '1': ['2Q18', 2340, 1234, 2000, 1230],
    '2': ['3Q18', 2130, 2200, 2190, 2210],   
    '3': ['FY18', 1000, 1900, 1500, 1800], 
})
vnzz0bqm

vnzz0bqm1#

在我看来,没有必要把这个框架换位。你可以用所需的值替换第0行,然后删除第1行:

def get_unified_value(vals):
    if vals[1].startswith("Q"):
        return vals[1][1:] + "Q" + vals[0][2:]
    
    return vals[0]

df.loc[0, :] = list(map(get_unified_value, zip(df.loc[0, :], df.loc[1, :])))
print(
    df.drop(1).reset_index(drop=True)
)

输出量:

0     1     2     3
0  1Q18  2Q18  3Q18  FY18
1  1500  2340  2130  1000
2  1200  1234  2200  1900
3   950  2000  2190  1500
4  2200  1230  2210  1800
j8ag8udp

j8ag8udp2#

我建议使用列标题来存储这些信息。
也就是说,你可以使用索引和字符串切片:

# replace first row when matching Qx
# get quarter number + "Q" + year
df.loc[0, df.loc[1].str.match(r'Q\d')] = df.loc[1].str[-1].add('Q'+df.loc[0].str[-2:])

# drop second row
df.drop(1, inplace=True)

print(df)

输出量:

0     1     2     3
0  1Q18  2Q18  3Q18  FY18
2  1500  2340  2130  1000
3  1200  1234  2200  1900
4   950  2000  2190  1500
5  2200  1230  2210  1800

相关问题