我有这样的数据表。
A B1 B2 B3 C
3 1 2 0 'foo'
5 1 4 5 'bar'
7 0 3 0 'baz'
8 0 0 0 'foo'
我想创建一个如下所示的新数据表:
A B C
1.5 1 'foo'
1.5 2 'foo'
1.67 1 'bar'
1.67 4 'bar'
1.67 5 'bar'
7 3 'baz'
8 0 'foo'
根据以下规则:
B#
列均不为零,请创建一个A
未更改且B = 0
的新行。n >= 1
列的B#
为零,则创建n
个新行,每个行的A
更改为A/n
和B
等于其中一个非零B#
列。 C
孤身一人。我不关心新行的顺序。我处理的实际数据表是几十兆字节,所以如果可能的话,我更喜欢避免不必要的重复复制的解决方案。
答案 0 :(得分:0)
这是一个完成这些工作的函数:
def transform(df):
""" Iterate over rows of transformed dataframe. """
for i, r in df.iterrows():
# count number of B# that equal to 0
n = sum(r[1:3] == 0)
if n == 0:
yield [r.A, 0, r.C]
else:
yield [r.A/n, r.B1, r.C]
yield [r.A/n, r.B2, r.C]
yield [r.A/n, r.B3, r.C]
new_df = pd.DataFrame(transform(df))