【问题标题】:Creating row numbers based on a column value根据列值创建行号
【发布时间】:2020-10-24 19:47:49
【问题描述】:

我的 jupyter notebook 中有以下数据集作为输入:

Product   Year    Variable
A         2018        2
A         2019        4
B         2018        2
B         2019        3

我想知道在我的数据集中创建循环或其他东西或排序的最快方法是什么,以便我得到以下输出:

Product   Year    Variable   Row_Num
A         2018        2         1
A         2018        2         2 
A         2019        4         1
A         2019        4         2
A         2019        4         3
A         2019        4         4
B         2018        2         1
B         2018        2         2
and so on...

TL;DR - 基于特定列中的变量,我想创建行。例如,如果变量为 3,我想创建该行的 3 个副本,其中有一列的值为 1、2、3。

我认为我找到的一种方法是首先根据我的变量创建重复项,然后使用类似于 rank() 或 row_number() 的函数来创建我的“row_num”列。如果任何人都可以分享其他可能的方法来做同样的事情,那将会很有帮助。 ????

【问题讨论】:

  • 欢迎来到 SO。请在您的问题中同时包含输入和预期输出作为文本,以便其他人可以轻松复制它。
  • @Roy2012 谢谢罗伊,我已经更新了。希望这对每个人都有帮助。
  • 在下面查看我的答案。

标签: python pandas numpy loops


【解决方案1】:

如果我理解正确,您希望为每一行创建 n 副本,其中 n 的值在其中一列中给出。这是一种方法:

df["new_id"] = df.Variable.apply(lambda x: list(range(x)))
df = df.explode("new_id")

输出:

  Product  Year  Variable new_id
0       A  2018         2      0
0       A  2018         2      1
1       A  2019         4      0
1       A  2019         4      1
1       A  2019         4      2
1       A  2019         4      3
2       B  2018         2      0
2       B  2018         2      1
3       B  2019         3      0
3       B  2019         3      1
3       B  2019         3      2

熊猫解决方案

如果由于某种原因,explode 不可用,因为您使用的是旧版本的 pandas,您可以执行以下操作:

cols = df.columns

def make_df(r):
    d = {k: r[k] for k in cols}
    d["new_var"] = range(r["Variable"])
    res = pd.DataFrame(d)
    return res

dfs = []
for row in df.iterrows():
    dfs.append(make_df(row[1]))
    
pd.concat(dfs)

输出是相同的。

【讨论】:

  • 嗨 Roy,感谢您的快速解释,它非常清晰易懂。你回答的第一行对我来说没有问题。但是,当我使用你提到的explode函数时,我得到一个错误:'DataFrame' object has no attribute 'explode
  • 嗯。你用的是什么版本的熊猫?也许您需要更新它?
  • 啊,是的。你说的对。我正在使用 Python 2.7.5。它必须导入旧版本的 pandas 并因此导致此错误。感谢您的帮助罗伊! PS有没有万一爆炸的替代品?
  • 嗯。需要调查一下。
  • 尝试升级到 pandas 0.25。它适用于 python 2.7,并支持“爆炸”。
猜你喜欢
  • 1970-01-01
  • 2021-02-28
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
相关资源
最近更新 更多