根据列中的值重复行
Posted
技术标签:
【中文标题】根据列中的值重复行【英文标题】:Duplicate rows, according to value in a column 【发布时间】:2018-11-20 14:54:25 【问题描述】:我想读取一个 Excel 文件,并希望我的代码根据该 excel 文件中某一列中的值复制行。
例如
Col 1 Col 2
0 Adam 3
1 Sarah 2
2 John 0
我希望我的代码读取上述文件并复制 Adam 的行 3 次和 Sarah 的行 2 次并导出到一个新文件中。
【问题讨论】:
【参考方案1】:如果删除RangeIndex
,则使用repeat
和loc
:
print (df.index.repeat(df['Col 2']))
Int64Index([0, 0, 0, 1, 1], dtype='int64')
df = df.loc[df.index.repeat(df['Col 2'])].reset_index(drop=True)
print (df)
Col 1 Col 2
0 Adam 3
1 Adam 3
2 Adam 3
3 Sarah 2
4 Sarah 2
然后:
df.to_csv(file, index=False)
重复索引或DatetimeIndex
的一般解决方案是重复由numpy.arange
创建的numpy 数组,并由iloc
按位置选择:
df = df.iloc[np.arange(len(df)).repeat(df['Col 2'])].reset_index(drop=True)
编辑:
没有np.repeat
的解决方案:
df =df.loc[[c for a, b in zip(df.index, df['Col 2']) for c in [a] * b]].reset_index(drop=True)
print (df)
Col 1 Col 2
0 Adam 3
1 Adam 3
2 Adam 3
3 Sarah 2
4 Sarah 2
【讨论】:
感谢 Jezrael 的帮助,但我收到 TypeError - TypeError: Cannot cast array data from dtype('int64') to dtype('int32') 根据规则“安全”跨度> 试试df.loc[df.index.repeat(df['Col 2']).astype(np.int64)].reset_index(drop=True)
import pandas as pd import numpy as np 这是我正在使用的代码,但仍然出现类型错误。 readFile = pd.read_csv('test.csv') df = pd.DataFrame(readFile) x = df.loc[df.index.repeat(df['Col 2']).astype(np.int64)].reset_index (drop=True) 打印(x)
@Mob - 看起来像 pandas 版本问题,你的 pandas 版本是什么?
@Mob - 添加了没有np.repeat
的解决方案【参考方案2】:
解决这个问题的另一种方法,
pd.merge(pd.DataFrame(df['Col 1'].repeat(df['Col 2'])),df,on=['Col 1'])
【讨论】:
虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。以上是关于根据列中的值重复行的主要内容,如果未能解决你的问题,请参考以下文章