如何在具有未定义列数的数据帧上执行数学运算?

3

我有一个数据框,其中包含无限数量的列,稍后再定义。就像这样:

索引 GDP 2004 2005 ...
巴西 1000 0.10 0.10 ...
中国 1000 0.15 0.10 ...
印度 1000 0.05 0.10 ...
df = pd.DataFrame({'index': ['brasil', 'china', 'india'],
                   'GDP': [1000,1000,1000],
                   '2004': [0.10, 0.15, 0.05],
                   '2005': [0.10, 0.10, 0.10]})

由于初始GDP是GDP列,而从2004年开始的列是浮点数,表示每年的GDP增长百分比。

使用百分比来获取每年GDP的绝对数值,基于初始GDP。我需要一个像这样的数据框:

指数 GDP 2004 2005
巴西 1000 1100 1210
中国 1000 1150 1265
印度 1000 1050 1155

我尝试使用itertuples、df.columns和for循环,但可能漏掉了某些东西。

请记住,列数是不确定的。

非常感谢您的帮助!


有多种方法可以解决这个问题。如果您只想考虑要处理哪些列,请查看df.columns。使用df.melt将是一种更高级的方法。请查看相关文档。 - The Lazy Graybeard
你的意思是印度的值是0.05而不是代码片段中的0.5。我在下面的答案中使用了更正后的数字。 - user19077881
4个回答

1
我的回答是Wardy和user19*的结合。
首先从...开始。
df = pd.DataFrame(data={'GDP':   [1000, 1000, 1000],
                        '2004':  [0.10, 0.15, 0.5],
                        '2005':  [0.10, 0.10, 0.10],
                        'index': ['brasil', 'china', 'india']})

找到百分比列并确保它们按正确顺序排列。

columns_of_interest = sorted(c for c in df.columns if c not in ['GDP', 'index'])

现在我们计算...
running_GDP = df['GDP'] # starting value
for column in columns_of_interest:
    running_GDP *= 1.0 + df[column]
    df[column] = running_GDP

这导致...
    GDP     2004    2005    index
0   1000    1100.0  1210.0  brasil
1   1000    1150.0  1265.0  china
2   1000    1500.0  1650.0  india

一个可能更好的答案是使用 sorted(c for c in df.columns if re.match('\d{4}', c)) - The Lazy Graybeard

0
你可以使用 df.columns 访问数据框列的列表。
然后,您可以循环遍历所有这些列名。以下是一个示例,其中我将数据帧中的每个值乘以2。如果您想对不同的列进行不同的操作,可以在循环中添加条件。
df = pd.DataFrame({'index': ['brasil', 'china', 'india'],
               'GDP': [1000,1000,1000],
               '2004': [0.10, 0.15, 0.5],
               '2005': [0.10, 0.10, 0.10]})


for colName in df.columns:
    df[colName] *= 2

print(df)

这将返回...

          index   GDP  2004  2005
0  brasilbrasil  2000   0.2   0.2
1    chinachina  2000   0.3   0.2
2    indiaindia  2000   1.0   0.2

希望这有所帮助!

0

一种简单的方法是计算列数并循环:

num = df.shape[1]
start = 2

for idx in range(start, num):
    df.iloc[:, idx] = df.iloc[:, idx-1] * (1+df.iloc[:, idx])

print(df)

这提供了

    index   GDP    2004    2005
0  brasil  1000  1100.0  1210.0
1   china  1000  1150.0  1265.0
2   india  1000  1050.0  1155.0

0

将百分比加一;计算累积乘积;

q = (df.iloc[:,2:] + 1).cumprod(axis=1)

乘以起始 GDP。

q = q.mul(df['GDP'],axis='index')

如果你想修改原始的DataFrame,请将结果赋值给它。
df.iloc[:,2:] = q

如果你想创建一个新的DataFrame,则需要将结果与原始数据的第一列连接起来。
new = pd.concat([df.iloc[:,:2],q],axis=1)

如果你愿意,可以把这前两行合并成一行。

q = (df.iloc[:,2:] + 1).cumprod(axis=1).mul(df.GDP,axis='index')

这段代码中有错别字和语法错误。它无法被处理。 - user19077881
抱歉,我当时在手机上,并没有测试过它。还有其他的问题也出现了。谢谢你指出来。 - wwii

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接