当前位置: 首页 > 面试题库 >

通过列值复制熊猫数据框中的行

邹驰
2023-03-14
问题内容

我想在Pandas Dataframe中复制行。每行应重复n次,其中n是每行的一个字段。

import pandas as pd

what_i_have = pd.DataFrame(data={
  'id': ['A', 'B', 'C'],
  'n' : [  1,   2,   3],
  'v' : [ 10,  13,   8]
})

what_i_want = pd.DataFrame(data={
  'id': ['A', 'B', 'B', 'C', 'C', 'C'],
  'v' : [ 10,  13,  13,   8,   8,   8]
})

这可能吗?


问题答案:

您可以np.repeat用来获取重复的索引,然后使用它来索引框架:

>>> df2 = df.loc[np.repeat(df.index.values,df.n)]
>>> df2
  id  n   v
0  A  1  10
1  B  2  13
1  B  2  13
2  C  3   8
2  C  3   8
2  C  3   8

之后,只需清理一下即可:

>>> df2 = df2.drop("n",axis=1).reset_index(drop=True)
>>> df2
  id   v
0  A  10
1  B  13
2  B  13
3  C   8
4  C   8
5  C   8

请注意,如果您可能有重复的索引值得担心,则可以.iloc改用:

In [86]: df.iloc[np.repeat(np.arange(len(df)), df["n"])].drop("n", axis=1).reset_index(drop=True)
Out[86]: 
  id   v
0  A  10
1  B  13
2  B  13
3  C   8
4  C   8
5  C   8

使用位置,而不使用索引标签。



 类似资料:
  • 问题内容: 我注意到程序中存在一个错误,发生该错误的原因是因为熊猫似乎是通过引用熊猫数据框而不是通过值进行复制。我知道不可变对象将始终通过引用传递,但pandas数据帧不是不可变的,因此我不明白为什么它通过引用传递。谁能提供一些信息? 谢谢!安德鲁 问题答案: Python中的所有函数都是“按引用传递”,没有“按值传递”。如果要显式复制pandas对象,请尝试。

  • 这是一个非常基本的问题,我似乎找不到答案。 我有一个这样的数据帧,叫做df: 然后我从df中提取所有行,其中列'B'的值为'B.2'。我将这些结果分配给df_2。 df_2变成: 然后,我将列B中的所有值复制到名为D的新列中。使df_2成为: 当我执行这样的任务时: 我得到以下警告: 试图在数据帧切片的副本上设置值。尝试使用。loc[row\u indexer,col\u indexer]=改为v

  • 问题内容: 我有两个具有以下列名称的数据框: 我想通过加入(左)on获得以下列的数据框: 如果我要连接的列不是索引,我无法弄清楚该怎么做。最简单的方法是什么?谢谢! 问题答案: 您可以按以下方式使用left_on和right_on选项: 从问题中我不能确定您是否只想合并密钥是否位于左侧数据框中。如果是这种情况,则以下将执行此操作(以上内容实际上会进行多对多合并)

  • 我想使用两列作为行ID,同时计算基于时间的分组。请看下图: 转化成这样: 正在发生的是,X在时间10发生了0次,但在15和23发生了1次。 Y在10点钟发生了3次,但在15和23没有。等等。

  • 我有以下数据框: 我想将其转换为: i、 e.我希望保留前4列,但将剩余的每列值分配到单独的行中。有没有一种不使用for循环的方法来实现这一点?

  • 问题内容: 我有很多行的python pandas数据框。从这些行中,我想切出并且仅使用“ body”列中包含单词“ ball”的行。为此,我可以这样做: 问题是,我希望它不区分大小写,这意味着如果出现Ball或bAll一词,我也希望它们。进行不区分大小写的搜索的一种方法是将字符串转换为小写,然后以这种方式搜索。我想知道如何去做。我试过了 但这是行不通的。我不确定是否应该在此等性质上使用lambd