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

在pandas数据框中的特定索引处插入新行

马正初
2023-03-14
问题内容

我有一个带有两列“标识符”,“值”和“子标识”的以下数据框 df

     identifier   values    subid
0      1          101       1
1      1          102       1
2      1          103       2 #index in list x        
3      1          104       2
4      1          105       2
5      2          106       3   
6      2          107       3
7      2          108       3
8      2          109       4 #index in list x
9      2          110       4
10     3          111       5
11     3          112       5 
12     3          113       6 #index in list x

我有一个索引列表,例如

x = [2, 8, 12]

我想在列表x中提到的索引之前插入行。就像,对于在索引2之前插入的行,将具有以下值,它将具有 在索引2处的行 相同的标识符 ,即1;
索引2的行 相同的值 ,即103;但是新行中的 subid
将是((索引2处的subid)-1),或者仅仅是前一行的subid,即1。

以下是我期望的最终结果df:

   identifier   values    subid
0      1          101       1
1      1          102       1
2      1          103       1 #new row inserted     
3      1          103       2 #index in list x        
4      1          104       2
5      1          105       2
6      2          106       3   
7      2          107       3
8      2          108       3
9      2          109       3 #new row inserted
10     2          109       4 #index in list x
11     2          110       4
12     3          111       5
13     3          112       5 
14     3          113       5 #new row inserted
15     3          113       6 #index in list x

我一直在尝试的代码:

 m = df.index       #storing the indices of the df
 #m

 for i in m:
     if i in x:     #x is the given list of indices
         df.iloc[i-1]["identifier"] = df.iloc[i]["identifier"]
         df.iloc[i-1]["values"] = df.iloc[i]["values"]
         df.iloc[i-1]["subid"] = (df.iloc[i]["subid"]-1)
 df

上面的代码只是 替换 (i-1)索引处的行,而 不用 上述值 插入 其他行。请帮忙。

如果有任何不清楚的地方,请告诉我。


问题答案:

保留索引顺序是棘手的部分。我不确定这是否是最有效的方法,但是它应该可以工作。

x = [2,8,12]
rows = []
cur = {}

for i in df.index:
    if i in x:
        cur['index'] = i
        cur['identifier'] = df.iloc[i].identifier
        cur['values'] = df.iloc[i]['values']
        cur['subid'] = df.iloc[i].subid - 1
        rows.append(cur)
        cur = {}

然后,遍历新行列表,并执行增量连接,将每个新行插入正确的位置。

offset = 0; #tracks the number of rows already inserted to ensure rows are inserted in the correct position

for d in rows:
    df = pd.concat([df.head(d['index'] + offset), pd.DataFrame([d]), df.tail(len(df) - (d['index']+offset))])
    offset+=1


df.reset_index(inplace=True)
df.drop('index', axis=1, inplace=True)
df

    level_0 identifier  subid   values
0         0          1      1      101
1         1          1      1      102
2         0          1      1      103
3         2          1      2      103
4         3          1      2      104
5         4          1      2      105
6         5          2      3      106
7         6          2      3      107
8         7          2      3      108
9         0          2      3      109
10        8          2      4      109
11        9          2      4      110
12       10          3      5      111
13       11          3      5      112
14        0          3      5      113
15       12          3      6      113


 类似资料:
  • 问题内容: 我可以在熊猫的特定列索引处插入列吗? 这会将列作为的最后一列,但是没有办法告诉它放在开始处吗? 问题答案: 参见文档:http : //pandas.pydata.org/pandas- docs/stable/genic/pandas.DataFrame.insert.html 使用loc = 0将在开头插入

  • 问题内容: 如何在另一个字符串的特定索引处插入一个字符串? 假设我想在“ foo”之后插入“ bar”,我该如何实现? 我想到了,但必须有一个更简单,更直接的方法。 问题答案: 您可以将自己的原型制作为String。 Polyfill 例 编辑: 对其进行了修改,以确保它是一个绝对值。

  • 基于单个值/标签的切片 基于一个或多个级别的多个标签的切片 布尔条件和表达式的过滤 哪些方法适用于什么情况 为简单起见的假设: 输入数据表没有重复的索引键 下面的输入数据只有两个级别。(此处所示的大多数解决方案都概括为N个级别) 问题2b 我如何获得级别“二”中对应于“t”和“w”的所有值? 如何从检索横截面,即具有索引特定值的单行?具体来说,如何检索的横截面,由 如何选择与和相对应的两行?

  • 问题内容: 摘要:这不起作用: 但是这样做: 为什么? 再生产: 这不起作用: 但是这样做: 链接到笔记本 我的问题是: 为什么只有第二种方式起作用?我似乎看不到选择/索引逻辑的差异。 版本是0.10.0 编辑:这不应该再这样了。从0.11版开始,提供。参见此处:http : //pandas.pydata.org/pandas- docs/stable/indexing.html 问题答案: 大

  • 如何将项目插入到特定索引的列表中?不使用: 帮助!

  • 我有这个: 有没有办法可以得到更新后的列表,而不是就地更新原始列表?