pandas 如何在列数未定义的 Dataframe 上进行数学运算?

vybvopom  于 2022-12-16  发布在  其他
关注(0)|答案(4)|浏览(117)

我有一个数据框,其中列数不确定,稍后定义,如下所示:
| 指标|国内生产总值|二○ ○四年|二○ ○五年|...|
| - ------|- ------|- ------|- ------|- ------|
| 巴西尔|一千|0.10分|0.10分|...|
| 瓷器|一千|0.15| 0.10分|...|
| 印度|一千|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增长有关。
使用百分比得到的绝对数量的国内生产总值在每一年,基于初始国内生产总值。我需要这样的数据框:
| 指标|国内生产总值|二○ ○四年|二○ ○五年|
| - ------|- ------|- ------|- ------|
| 巴西尔|一千|1100年|小行星121|
| 瓷器|一千|小行星1150|小行星1265|
| 印度|一千|小行星1050|小行星|
我尝试使用itertuples、df.columns和for循环,但我可能遗漏了一些东西。

  • 请记住,列数是无限的。*
    提前感谢您!
hof1towb

hof1towb1#

我的答案是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
kwvwclae

kwvwclae2#

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

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
tpxzln5u

tpxzln5u3#

您可以使用df.columns访问 Dataframe 列的列表。
然后你可以对所有的列名做一个循环。这里是一个数据框的例子,我把每个值乘以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

希望这有帮助!

j9per5c4

j9per5c44#

百分比加1;计算累积乘积;

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

乘以初始gdp。

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

如果您尝试更改原始DataFrame,请分配结果。

df.iloc[:,2:] = q

如果要创建新DataFrame,请将结果与原始DataFrame的前几列连接起来。

new = pd.concat([df.iloc[:,:2],q],axis=1)

如果你愿意,可以把前两行放在一起。

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

相关问题