python-3.x - Pandas -- .add() 导致 TypeError: 'int' object is not iterable
问题描述
我在使用 .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)
我收到以下错误:
回溯(最近一次通话最后):
文件“”,第 1 行,在 DataSynthNormal2(empty, 'C', 'B', 0.8, 10, 4, 0, 1)
文件“”,第 7 行,在 DataSynthNormal2 中 data[column] = data[column].add(data1, fill_value=0)
文件“C:\Users\User\Anaconda3\lib\site-packages\pandas\core\ops.py”,第 1358 行,在 flex_wrapper self.index 中)。完成(自己)
文件“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 值 = [tuple(x) for x in values]
文件“C:\Users\User\Anaconda3\lib\site-packages\pandas\core\common.py”,第 317 行,值 = [tuple(x) for x in values]
TypeError:“int”对象不可迭代
我在这里尝试使用 .add() ,因为它在添加两个数据帧时保存 NaN,而不是 .fillna(0) (由于某种原因,它一直在输出 nxn 矩阵)。我希望它这样做,因为它试图模拟的真实数据始终包含空白和 0。我也不能使用“data[column] = data1”,因为我需要在不同的时间使用其他条件(=='D',=='E')并且具有不同的均值和标准。
有谁知道如何解决这个问题?
解决方案
提出了一个解决方案,其中涉及创建第二个函数:
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
第二个,它需要双倍的输入并将它们全部组合在一起。这些似乎有效。
推荐阅读
- mongodb - 通过 GUI 连接到在 GKE 中运行的 MongoDB 实例
- javascript - 如何使用内联样式来使用变换:rotate() 与 react.js 滚动
- reactjs - 使用 Create-react-app 在我的 github 页面上出现错误 404。这是一个没有路由的简单应用程序
- c++ - 代码是如何在 C++ 抽象机上存储和执行的?
- erlang - 如何在 Erlang 中加速“使用两个堆栈的队列”
- arrays - 获取 N 个整数的 numpy 数组的索引
- javascript - 从本地文件夹动态更改 React 中的背景图像
- swiftui - 计算属性未更新以在 Xcode 12 中显示工作表的问题(以前工作)
- reactjs - React 和 Flask POST 请求错误:CORS 策略:没有“Access-Control-Allow-Origin”
- django - 从 Stripe 付款后如何将客户重定向到成功页面?