我正在尝试为自己创建一种会计工具。 我有看起来像这样的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
答案 0 :(得分:1)
您可以使用dictionary of DataFrames
和x
列的唯一值来创建具有键的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