熊猫位置不会为数据框增加价值

时间:2020-09-02 22:42:13

标签: python pandas

所以我想在现有值中为熊猫数据框中的特定位置添加一个值。我尝试如下:

import calendar
for index,row in data.iterrows():
    print(index)
    if row.mask:
        date = calendar.monthrange(int(row.year), int(row.month))
        date = pd.to_datetime(str(int(row.year))+'-'+str(int(row.month))+'-'+str(date[1]))
        diff = data.real - data.fiction
        df.loc[df.date==date, 'zeta']+=diff

但是最后此操作后的值与之前的值相同,我不明白为什么我使用loc指向特定的positio并且可以更改值。但是我的行不通。

数据样本:

因此,这里涉及两个数据帧。一个是df,看起来像:

{'date': [datetime.date(2018, 7, 1),
  datetime.date(2018, 7, 2),
  datetime.date(2018, 7, 3),
  datetime.date(2018, 7, 4),
  datetime.date(2018, 7, 5),
  datetime.date(2018, 7, 6),
  datetime.date(2018, 7, 7),
  datetime.date(2018, 7, 8),
  datetime.date(2018, 7, 9),
  datetime.date(2018, 7, 10)],
 'alpha': [899.8399999999998,
  804.2400000000001,
  824.6400000000001,
  903.7599999999999,
  761.2900000000001,
  766.7999999999998,
  765.0699999999998,
  882.8600000000001,
  741.8199999999999,
  729.6600000000001],
 'beta': [660.24,
  514.87,
  456.6600000000001,
  490.29,
  469.83,
  506.4,
  571.65,
  651.18,
  545.5,
  544.99],
 'gamma': [1555.5299999999988,
  1512.829999999999,
  1507.4699999999991,
  1491.1799999999994,
  1019.4199999999994,
  650.0699999999995,
  674.7599999999999,
  676.0899999999992,
  464.05999999999966,
  455.03000000000003],
 'delta': [178.02,
  150.75,
  136.14999999999998,
  147.51999999999998,
  160.93000000000004,
  131.96999999999997,
  117.31,
  131.88,
  160.57000000000008,
  158.73999999999998],
 'epsilon': [0.0,
  375.7099915,
  464.85501100000005,
  464.8450012,
  484.63500980000003,
  514.664978,
  471.16000369999995,
  459.8599853999999,
  461.4349976,
  441.9400024],
 'zeta': [282.9800053,
  156.5300011,
  109.93999609999999,
  83.86999995,
  168.62735590000003,
  170.31219380000002,
  73.63714508,
  119.776293,
  179.14328830000002,
  446.6358328],
 'total': [3576.6100052999986,
  3514.929992599999,
  3499.7150070999996,
  3581.4650011499994,
  3064.7323656999997,
  2740.2171717999995,
  2673.5871487799996,
  2921.646278399999,
  2552.5282859,
  2776.9958352000003]}

数据如下:

{'month': [1, 2, 3, 4, 5, 6, 7, 8],
 'year': [2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020],
'fiction': [4904.049999999999,
  5098.29,
  8582.139999999998,
  13712.130000000001,
  20505.370000000003,
  3629.21,
  0.0,
  0.0],
 'real': [14528.33,
  12592.45,
  8582.14,
  13712.12,
  20505.4,
  19356.6,
  18205.0,
  13028.29],
 'mask': [True, True, False, False, False, True, True, True]}

掩码的计算方法如下:

(data.real - data.fiction).map(int).map(bool)

1 个答案:

答案 0 :(得分:0)

您有两个错误。

首先,不要在内置函数之后输入列名。

mask是一个内置函数,在任何情况下{"year": ["1999", "2000"], "name": ["bill", "jess"], "cardV": ["base","silver"]} 都将返回True。因为无论您希望函数存在与否,函数都会存在,因此实际上不使用基于函数的检查。我在if语句中添加了一条print语句。只是为了确保尝试将其添加到if块中,您将了解其中的区别。 (如果您必须用这种方式命名,尽管我无法想到必须选择内置函数名称的情况,请像这样:if row.mask,不要测试熊猫的智力。)

其次,.loc()会分配值。但是它们应该与目标尺寸相匹配。

您可能会收到一些错误消息。您很有可能希望在该特定行上有所不同(如果没有,则在遍历整个数据帧时会出现很大的问号),因此您可能想使用if row['mask']而不是{{1} }。我按预期进行了这两项更改和数据框更改。这是您可能要插入更改的代码

row.real - row.fiction