Python - 在数据帧中计算
Python - Calculating in dataframes
我在数据帧中计算时遇到问题。
我正在计算
- 每列变化百分比
- %-基于行总和的每列份额
现在我想根据每列的份额百分比计算每列的变化百分比。我会这样做:
(col A %-change * col A %-share) + (col B %-change * col B %-share) + (col C %-change * col C %-share) 等等。
我想到了两种方法来做到这一点,但都没有用......而且 - 当然 - 我想尽可能动态地做到这一点,因为列数会有所不同。
这里有一些代码可以得到合适的数据框:
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.array([
['2019-04-29', 5, 5, 10],
['2019-04-28', 10, 10, 50],
['2019-04-27', 20, 5, 100]]),
columns=['Date', 'attr1', 'attr2', 'attr3'])
df1["attr1"] = pd.to_numeric(df1["attr1"])
df1["attr2"] = pd.to_numeric(df1["attr2"])
df1["attr3"] = pd.to_numeric(df1["attr3"])
df1 = df1.set_index(['Date'])
col_list= list(df1)
df1['sum'] = df1[col_list].sum(axis=1)
for i in col_list:
df1[i + ' %-change'] = df1[i].pct_change()*100
df1[i + " %-share"] = df1[i]/ df1['sum']
想法 1:
基本上我正在尝试上面提到的公式。因此,将每列的份额百分比和变化百分比相乘,然后将它们相加。我考虑过使用 .sum 但不知道如何在这种特定情况下使用它。
df1[i + ' %-change incl share'] = (df1[i + ' %-share'] * df1[i + ' %-change'])
想法二:
考虑分两步进行。第一步是将每列的份额百分比和变化百分比相乘。第二步是在新代码行中汇总新列。问题是我不能动态地做到这一点。我将不得不手动 select 我需要汇总的列,但如果我有 100 列,那确实是一项乏味的工作。
我想过将新计算的列写入一个新的数据框中,这样我就得到了我需要的所有列,但是数据框中的数据对我来说毫无意义。
df2[i + ' %-change incl share'] = (df1[i + ' %-share'] * df1[i + ' %-change'])
一如既往,我们非常感谢您的帮助。
非常感谢!
您可以尝试将 dataframe.apply 与 lambda 函数一起使用。
# get the column name out
changeCol = [col for col in df1.columns if 'change' in col]
shareCol = [col for col in df1.columns if 'share' in col]
# calculate
result = df1.apply(lambda x: sum([x[changeCol[i]]*x[shareCol[i]] for i in range(len(changeCol))]), axis=1)
# after you could append the result to your dataframe or do whatever you like.
# df1["result"] = result
# ...
我在数据帧中计算时遇到问题。
我正在计算
- 每列变化百分比
- %-基于行总和的每列份额
现在我想根据每列的份额百分比计算每列的变化百分比。我会这样做:
(col A %-change * col A %-share) + (col B %-change * col B %-share) + (col C %-change * col C %-share) 等等。
我想到了两种方法来做到这一点,但都没有用......而且 - 当然 - 我想尽可能动态地做到这一点,因为列数会有所不同。
这里有一些代码可以得到合适的数据框:
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.array([
['2019-04-29', 5, 5, 10],
['2019-04-28', 10, 10, 50],
['2019-04-27', 20, 5, 100]]),
columns=['Date', 'attr1', 'attr2', 'attr3'])
df1["attr1"] = pd.to_numeric(df1["attr1"])
df1["attr2"] = pd.to_numeric(df1["attr2"])
df1["attr3"] = pd.to_numeric(df1["attr3"])
df1 = df1.set_index(['Date'])
col_list= list(df1)
df1['sum'] = df1[col_list].sum(axis=1)
for i in col_list:
df1[i + ' %-change'] = df1[i].pct_change()*100
df1[i + " %-share"] = df1[i]/ df1['sum']
想法 1: 基本上我正在尝试上面提到的公式。因此,将每列的份额百分比和变化百分比相乘,然后将它们相加。我考虑过使用 .sum 但不知道如何在这种特定情况下使用它。
df1[i + ' %-change incl share'] = (df1[i + ' %-share'] * df1[i + ' %-change'])
想法二: 考虑分两步进行。第一步是将每列的份额百分比和变化百分比相乘。第二步是在新代码行中汇总新列。问题是我不能动态地做到这一点。我将不得不手动 select 我需要汇总的列,但如果我有 100 列,那确实是一项乏味的工作。
我想过将新计算的列写入一个新的数据框中,这样我就得到了我需要的所有列,但是数据框中的数据对我来说毫无意义。
df2[i + ' %-change incl share'] = (df1[i + ' %-share'] * df1[i + ' %-change'])
一如既往,我们非常感谢您的帮助。
非常感谢!
您可以尝试将 dataframe.apply 与 lambda 函数一起使用。
# get the column name out
changeCol = [col for col in df1.columns if 'change' in col]
shareCol = [col for col in df1.columns if 'share' in col]
# calculate
result = df1.apply(lambda x: sum([x[changeCol[i]]*x[shareCol[i]] for i in range(len(changeCol))]), axis=1)
# after you could append the result to your dataframe or do whatever you like.
# df1["result"] = result
# ...