我想基于其他列的值来复制行的内容,但是希望索引不会重复。
df = pd.DataFrame({'Date': [0, 1, 2], 'Name': ['A', 'B', 'C'], 'val': [3, 1, 2]}, index=['DC', 'BB', 'BS']); df
df.reset_index(level=0,inplace = True)
pd.DataFrame(df.values.repeat(df.val, axis=0), columns=df.columns)
Input:
index Date Name val
0 DC 0 A 3
1 DC 0 A 3
2 DC 0 A 3
3 BB 1 B 1
4 BS 2 C 2
5 BS 2 C 2
预期的输出格式:
index Date Name val
0 DC 0 A 3
1 0 A 3
2 0 A 3
3 BB 1 B 1
4 BS 2 C 2
5 2 C 2
答案 0 :(得分:0)
您可以按某个列测试重复项,例如由df1['index']
设置,并由Series.duplicated
和loc
设置空字符串:
df1 = pd.DataFrame(df.values.repeat(df.val, axis=0), columns=df.columns)
df1.loc[df1['index'].duplicated(), 'index'] = ''
print (df1)
index Date Name val
0 DC 0 A 3
1 0 A 3
2 0 A 3
3 BB 1 B 1
4 BS 2 C 2
5 2 C 2
print (df1.dtypes)
index object
Date object
Name object
val object
dtype: object
但是如果要避免将所有值都转换为object
,请使用Index.duplicated
和DataFrame.loc
进行测试
Index.duplicated
:
df1 = df.loc[df.index.repeat(df.val)]
df1.loc[df1.index.duplicated(), 'index'] = ''
df1 = df1.reset_index(drop=True)
print (df1)
index Date Name val
0 DC 0 A 3
1 0 A 3
2 0 A 3
3 BB 1 B 1
4 BS 2 C 2
5 2 C 2
print (df1.dtypes)
index object
Date int64
Name object
val int64
dtype: object