使用.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(空,'C','B',0.8,10,4,0,1)
文件“”,在DataSynthNormal2中的第7行 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”, _sanitize_array中的第4163行 subarr = com._asarray_tuplesafe(data,dtype = dtype)
文件 “ C:\ Users \ User \ Anaconda3 \ lib \ site-packages \ pandas \ core \ common.py”, _asarray_tuplesafe中的第317行 值= [x个值中的元组(x)]
文件 “ C:\ Users \ User \ Anaconda3 \ lib \ site-packages \ pandas \ core \ common.py”, 317行,在 值= [x个值中的元组(x)]
TypeError:“ int”对象不可迭代
我在这里尝试使用.add(),因为当添加两个数据帧时,它保留了NaN,而不是.fillna(0)(由于某种原因,它一直输出n x n个矩阵)。我希望它执行此操作,因为要尝试模拟的真实数据同时具有空白和0。我也不能使用“ data [column] = data1”,因为我需要在不同的时间使用不同的均值和std使用其他条件(=='D',=='E')。
有人知道如何解决这个问题吗?
答案 0 :(得分:0)
提出一个解决方案,其中涉及创建第二个功能:
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
第二个输入将输入加倍,并将所有功能组合在一起。这些似乎有效。