pandas 循环通过 Dataframe 时有条件地设置变量

hiz5n14c  于 2023-02-02  发布在  其他
关注(0)|答案(1)|浏览(118)

在对 Dataframe 进行矢量化/循环时,难以将数据与其他 Dataframe 隔离。
df
| 姓名|当前平衡|可用_平衡|类型|
| - ------|- ------|- ------|- ------|
| abc|一千|二千|A型|
| 定义|一千|二千|B型|
settings
| 情景|A型|B型|
| - ------|- ------|- ------|
| 默认值|1个|第二章|
df-所需输出
| 姓名|当前平衡|可用_平衡|类型|2023年2月28日|2023年3月31日|
| - ------|- ------|- ------|- ------|- ------|- ------|
| abc|一千|二千|A型|二千|无|
| 定义|一千|二千|B型|一千|一千|
settings df告诉脚本如何将可用余额分配到以下期间。这是它的简化版本,我希望使用特定的月末日期和更长的期间,并进行各种设置。

def build_table(df: pd.DataFrame, periods: int = 2, scenario: str = 'Default'):
    from datetime import date

    def create_entry(df: pd.DataFrame, i: int = 1, start_period: int = 1):
        number_periods = settings.loc[settings.Scenario == 'Default', df.Type]
        return (df.Avail_Bal / number_periods) if i <= number_periods else 0

    for i in range(periods):
        df[ (date.toady() + pd.offsets.MonthEnd() + pd.DateOffset(months=i)).date() ] = \
            create_entry(df, i, scenario)
    return df

到目前为止,在尝试获取与 Dataframe 的1行相关的条件值时遇到以下行错误:
number_periods = settings.loc[settings.Scenario == 'Default', df.Type]
ValueError:具有多个元素的数组的真值不明确。请使用. any()或. all()
在这个项目中有很多工作要做,但是现在我试着理解在哪里可以使用矢量化,以及什么时候必须迭代行。

mzsu5hc0

mzsu5hc01#

我认为您希望使用.apply()create_entry函数应用于 Dataframe ,此外,.loc方法的结果是一个系列,因此您需要选择实际值(我使用.max()执行此操作

df = pd.DataFrame({
    'NAME': ['Abc', 'Def'], 
    'CURRENT_BAL': [1000, 1000],
    'AVAIL_BAL': [2000, 2000], 
    'TYPE': ['TypeA', 'TypeB']
})
settings = pd.DataFrame({'Scenario': ['Default'], 'TypeA': [1], 'TypeB': [2]})

def create_entry(row, i):
    number_periods = settings.loc[settings.Scenario == 'Default', row.TYPE].max()
    return (row.AVAIL_BAL / number_periods) if i <= number_periods else 0

for i in range(1, 3):
    date_col = (date.today() + pd.offsets.MonthEnd() + pd.DateOffset(months=i)).date()
    df[date_col] = df.apply(lambda x: create_entry(x, i), axis=1)

输出:

NAME  CURRENT_BAL  AVAIL_BAL   TYPE  2023-03-28  2023-04-28
0  Abc         1000       2000  TypeA      2000.0         0.0
1  Def         1000       2000  TypeB      1000.0      1000.0

相关问题