首页 > 解决方案 > 如何从这两个其他单元格之间的大多数单元格的列中提取 Pandas 中其他两个单元格之间的所有单元格?

问题描述

我有多个财务报表,但并非所有财务报表都有相同的条目——有些条目比其他的多——我想将它们全部合并到一个包含所有条目的单一报表中。

我可以在 Excel 中手动完成,因为它不是很多,但我想让计算机做它来仔细检查我得到了它们。

所以,这就是我所做的:我创建了一个数据框,其中每一列都有来自其中一个财务报表的条目名称。

财务报表1 财务报表2 财务报表3
收入 收入 收入
收入1 收入1 收入1
收入2 收入2 收入2
花费 花费 收入3
费用1 费用1 花费
费用2 利润 费用1
费用3 - 费用2
利润 - 利润
- - -

我的想法是运行一个脚本来分析两个组标题之间的单元格数量,并将这两个值之间的所有字符串返回到“合并”列,包括第一个,但不是最后一个。

我的最终结果将如下所示:

财务报表1 财务报表2 财务报表3 合并
收入 收入 收入 收入
收入1 收入1 收入1 收入1
收入2 收入2 收入2 收入2
花费 花费 收入3 收入3
费用1 费用1 花费 花费
费用2 利润 费用1 费用1
费用3 - 费用2 费用2
利润 - 利润 费用3
- - - 利润

我是 Pandas 的初学者,到目前为止,这是我通过在堆栈中搜索得出的结果:

df = pd.read_excel(file)
df['Consolidated']=0
df.head()

df['Consolidated'].iloc[1] = df['FinancialStatement1'][df['FinancialStatement1'].between(
    'REVENUES', 'EXPENSES',
    inclusive=False
    )].tolist()

但是,这段代码给了我"A value is trying to be set on a copy of a slice from a DataFrame". 我尝试只使用 df.iloc[3,0] 但它也不起作用。无论如何,这段代码无论如何都不会做我想要的,因为它没有选择两个组标题之间的大多数项目的列表。

标签: pythonpandasdataframe

解决方案


您可以创建列中所有条目的 SET。Python SET 将消除重复项。然后你转换到一个列表并使用所有条目的超集创建一个 pd 并将其连接回数据帧。

s = set()
for col in df.columns:
    s |= set(df[col])
l = sorted(list(s - set(['-'])))

df1 = pd.DataFrame(l,columns = ['Consolidated'])
df = df.join(df1,how='outer').replace(np.nan,'-')
财务报表1 财务报表2 财务报表3 合并
0 收入 收入 收入 花费
1 收入1 收入1 收入1 费用1
2 收入2 收入2 收入2 费用2
3 花费 花费 收入3 费用3
4 费用1 费用1 花费 利润
5 费用2 利润 费用1 收入
6 费用3 - 费用2 收入1
7 利润 - 利润 收入2
8 - - - 收入3

推荐阅读