根据列中的值重复行

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,则使用repeatloc

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 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。

以上是关于根据列中的值重复行的主要内容,如果未能解决你的问题,请参考以下文章

根据一列中的值对数据表行重新排序

MySQL根据列中的最大值获取行[重复]

根据 2 列和第三列中的条件删除重复行

根据另一列删除一列中的重复行并保持其他列不变

对于要求,我需要通过从该数据帧的列中的列表中的值创建行来将数据帧转换为 [重复]

如何检查同一数据框列中的重复值并通过根据频率删除行来应用 if 条件?