【问题标题】:Pandas -- .add() resulting in TypeError: 'int' object is not iterablePandas -- .add() 导致 TypeError: 'int' object is not iterable
【发布时间】:2018-12-10 18:18:58
【问题描述】:

我在使用 .add() 方法添加 Pandas 数据帧时遇到了一些问题。我有一个数据生成器,用于沿正常分布生成合成数据:

import pandas as pd
import numpy as np

def DataSynthNormal(data, sel, column, fracFull, TotalRows, SelRows, mean, std, abst=False):
    fraction = data.loc[data['A'] == sel, column].sample(frac = fracFull).index
    if abst:
        data1 = pd.DataFrame(np.absolute(np.random.normal(mean, std, round(SelRows*fracFull)).astype('int64')), index=fraction).reindex(range(TotalRows))
    else:
        data1 = pd.DataFrame(np.random.normal(mean, std, round(SelRows*fracFull)).astype('int64'), index=fraction).reindex(range(TotalRows))
    data[column] = data[column].add(data1, fill_value=0)

以这个数据框为例:

empty = pd.DataFrame(columns=['A','B'], index=range(0,10))
empty.A[0:4] = "C"; empty.A[4:7] = "D"; empty.A[7:10] = "E"
print(empty)
   A    B
0  C  NaN
1  C  NaN
2  C  NaN
3  C  NaN
4  D  NaN
5  D  NaN
6  D  NaN
7  E  NaN
8  E  NaN
9  E  NaN

并运行数据生成器:

DataSynthNormal(empty, 'C', 'B', 0.8, 10, 4, 0, 1)

我收到以下错误:

Traceback(最近一次调用最后一次):

文件“”,第 1 行,在 DataSynthNormal2(空, 'C', 'B', 0.8, 10, 4, 0, 1)

DataSynthNormal2 中的文件“”,第 7 行 数据[列] = 数据[列].add(data1, fill_value=0)

文件 "C:\Users\User\Anaconda3\lib\site-packages\pandas\core\ops.py", 第 1358 行,在 flex_wrapper 中 self.index).finalize(self)

文件 "C:\Users\User\Anaconda3\lib\site-packages\pandas\core\series.py", 第 274 行,在 init 中 raise_cast_failure=True)

文件 "C:\Users\User\Anaconda3\lib\site-packages\pandas\core\series.py", 第 4163 行,在 _sanitize_array subarr = com._asarray_tuplesafe(data, dtype=dtype)

文件 "C:\Users\User\Anaconda3\lib\site-packages\pandas\core\common.py", 第 317 行,在 _asarray_tuplesafe 中 values = [tuple(x) for x in values]

文件 "C:\Users\User\Anaconda3\lib\site-packages\pandas\core\common.py", 第 317 行,在 values = [tuple(x) for x in values]

TypeError: 'int' 对象不可迭代

我在这里尝试使用 .add() ,因为它在添加两个数据帧时保存 NaN,而不是 .fillna(0) (由于某种原因,它一直在输出 n x n 矩阵)。我希望它这样做,因为它试图模拟的真实数据始终包含空白和 0。我也不能使用“data[column] = data1”,因为我需要在不同的时间使用其他条件(=='D',=='E'),并且具有不同的均值和标准。

有人知道如何解决这个问题吗?

【问题讨论】:

    标签: python-3.x pandas add


    【解决方案1】:

    想出了一个解决方案,其中涉及创建第二个函数:

    def DataSynthNormal(data, sel, column, fracFull, TotalRows, selRows, mean, std, abst=False):
        fraction = data.loc[data['A'] == sel, column].sample(frac = fracFull).index
        if abst:
            data1 = pd.DataFrame(np.absolute(np.random.normal(mean, std, round(selRows*fracFull)).astype('int64')), index=fraction).reindex(range(TotalRows))
        else:
            data1 = pd.DataFrame(np.random.normal(mean, std, round(selRows*fracFull)).astype('int64'), index=fraction).reindex(range(TotalRows))
        data[column] = data1
    

    这是第一个,按您的预期工作。

    def DataSynthNormal2x(data, sel1, sel2, column, fracFull1, fracFull2, TotalRows, selRows1, selRows2, mean1, std1, mean2, std2, abst=False):
        fraction1 = data.loc[data['A'] == sel1, column].sample(frac = fracFull1).index
        fraction2 = data.loc[data['A'] == sel2, column].sample(frac = fracFull2).index
        if abst:
            data1 = pd.DataFrame(np.absolute(np.random.normal(mean1, std1, round(selRows1*fracFull1)).astype('int64')), index=fraction1).reindex(range(TotalRows))
            data2 = pd.DataFrame(np.absolute(np.random.normal(mean2, std2, round(selRows2*fracFull2)).astype('int64')), index=fraction2).reindex(range(TotalRows))
        else:
            data1 = pd.DataFrame(np.random.normal(mean1, std1, round(selRows1*fracFull1)).astype('int64'), index=fraction1).reindex(range(TotalRows))
            data2 = pd.DataFrame(np.random.normal(mean2, std2, round(selRows2*fracFull2)).astype('int64'), index=fraction2).reindex(range(TotalRows))
        data12 = data1.add(data2, fill_value=0)
        data[column] = data12
    

    第二个,它需要双倍的输入并将它们全部组合在一起。这些似乎有效。

    【讨论】:

      猜你喜欢
      • 2019-04-12
      • 2016-02-18
      • 2022-11-02
      • 2018-06-29
      • 2020-11-07
      • 2016-01-09
      • 1970-01-01
      • 2022-12-15
      • 2021-08-08
      相关资源
      最近更新 更多