我试图从同一数据帧中的每一行中减去每一行。我见过this。但是那里的代码不适用于多索引。你知道吗
这是我的数据帧的结构
a c z
index name
0 foo 15 8 0
bar 4 1 0
baz 7 2 0
toto 12 3 0
titi 5 0 0
1 foo 8 6 0
bar 4 1 0
baz 6 3 0
toto 5 1 0
titi 6 0 0
我想要的结构如下:
index name1 name2 a c z
0 foo bar 11 7 0
foo baz 8 6 0
bar baz -3 -1 0
我试过两件事。第一个不保留name1
,name2
,这在链接中本质上是相同的解决方案。你知道吗
第二个可以工作,但需要数小时来计算:
def df_diff(newticker: pd.DataFrame):
times = newticker.index.get_level_values("index")
timesu = times.unique()
symbols = newticker.index.get_level_values("name")
symbolsu = symbols.unique()
symb_combination = list(itertools.permutations(symbolsu, 2))
tuple_list = []
#
for timet in timesu:
for sym in symb_combination:
tuple_list.append((timet, sym[0], sym[1]))
#
mindex = pd.MultiIndex.from_tuples(tuple_list,
names=["index", "name1", "name2"])
cols = newticker.columns
#
dfdiff = pd.DataFrame(columns=cols,
index=mindex)
#
for symt in symb_combination:
sym1 = symt[0]
sym2 = symt[1]
sym1df = newticker.xs(sym1, level='name')
sym2df = newticker.xs(sym2, level='name')
symdiff = sym1df.values - sym2df.values
dfdiff.loc[(slice(None), sym1, sym2), :] = symdiff
#
return dfdiff
我相信有一种更优雅的方式来做我想做的事。我会感激任何帮助。你知道吗
你有一个构造良好的数据帧,我们需要做的就是
merge
,然后groupby
相关问题 更多 >
编程相关推荐