在Pandas中自动创建DataFrames

时间:2018-07-15 06:22:09

标签: python python-2.7 pandas

我正在尝试为自己创建一种会计工具。 我有看起来像这样的DataFrame:

d = {'a': [1000, 2000, 3000], 'x': [999, 888, 555], 'y': [555, 999, 888]}
df = pd.DataFrame(data=d)

     a       x       y
0   1000    999     555
1   2000    888     999
2   3000    555     888

其中 x y 是相应的帐户数(即999表示银行帐户等),而 a 是美元价格。 我想为每个帐户创建一个新的DataFrame,其中包含相应行中的 a 列中的值而不是帐户号。

对于 999 ,它看起来像这样

    x    y
0  1000  0
1   0   2000

对于 555 ,它看起来像这样

    x    y
0   0  1000
1  3000  0

以此类推。

我为第一个帐户执行了此代码,并且可以正常工作,但是看起来太复杂了。

df2 = df.copy(deep=True)
df2 = df[(df2.x == 999) | (df2.y == 999)]
def fx(p):
    if p == 999:
        return 1
    else:
        return 0
df2.x = df2.x.apply(fx)
df2.y = df2.y.apply(fx)
df2.x = df2.x.replace(1, df2.a)
df2.y = df2.y.replace(1, df2.a)
del df2['a']

有没有一种方法可以简化它并为每个帐户执行此操作?我不想复制代码并粘贴每个帐户的代码。

预先感谢您,我已经坚持了几天。

我在Ubuntu 16.04.4 Xenial上使用python 2.7.12

1 个答案:

答案 0 :(得分:1)

您可以使用dictionary of DataFramesx列的唯一值来创建具有键的y

#convert columns to numpy array
arr = df[['x','y']].values
a = df['a'].values

#empty dictionary
dfs = {}
#loop by all unique values
for i in np.unique(arr.ravel()):
    #create 2d boolean mask
    mask = (arr == i)
    #convert mask to integers - Trues are 1 anf False are 0 and multiple by a 
    out = a[:, None] * mask.astype(int)
    #filter out only 0 rows and create DataFrame
    df = pd.DataFrame(out[mask.any(axis=1)], columns=['x','y'])
    #print (df)
    #add df to dict
    dfs[i] = df

通过查找选择:

print (dfs[999])   
      x     y
0  1000     0
1     0  2000

print (dfs[555])
      x     y
0     0  1000
1  3000     0