如何将列表中的值插入 pandas 数据框列?

How can i insert values from a list into a pandas data frame column?

我有这个数据框:

index x y
0 0 3
1 0.07 4
2 0.1 6
3 0. 13 5

我想向 x 列插入新的 x 值

new_x = [0, 0.03, 0.07, 0.1, 0.13, 0.17, 0.2]

这样数据框就变成了

index x y
0 0 3
1 0.03 NaN
2 0.07 4
3 0.1 6
4 0. 13 5
5 0. 17 NaN
6 0. 2 NaN

所以基本上对于 column x 中不存在的每个 new_x 值,y valueNaN

是否可以在 pandas 中完成?谢谢

您可以使用 Numpy 的 searchsorted

创建与 new_x 数组长度相同的 new_y 数组后。您使用 searchsorted 来确定 new_y 数组中您需要删除旧 y 值的位置。

new_y = np.full(len(new_x), np.nan, np.float64)
new_y[np.searchsorted(new_x, df.x)] = df.y

pd.DataFrame({'x': new_x, 'y': new_y})

      x    y
0  0.00  3.0
1  0.03  NaN
2  0.07  4.0
3  0.10  6.0
4  0.13  5.0
5  0.17  NaN
6  0.20  NaN

这是 merge 函数对 pandas 的直接应用。更具体地说 left join.


import pandas as pd

x1 = [0, 0.07, 0.1, 0.13]
y1 = [3, 4, 6, 5]
df1 = pd.DataFrame({"x": x1, "y": y1})

print(df1)

x2 = [0, 0.03, 0.07, 0.1, 0.13, 0.17, 0.2]
df2 = pd.DataFrame({"x": x2})

print(df2)

df3 = df2.merge(df1, how="left", on="x")
print(df3)


      x  y
0  0.00  3
1  0.07  4
2  0.10  6
3  0.13  5

      x
0  0.00
1  0.03
2  0.07
3  0.10
4  0.13
5  0.17
6  0.20

      x    y
0  0.00  3.0
1  0.03  NaN
2  0.07  4.0
3  0.10  6.0
4  0.13  5.0
5  0.17  NaN
6  0.20  NaN

您可以尝试使用join方法。这是一些您可以参考的示例代码

d1 = {'x': [0, 0.07, 0.1, 0.13], 'y': [3,4,6,5]}
d2 = {'x': [0, 0.03, 0.07, 0.1, 0.13, 0.17, 0.2]}
df1 = pd.DataFrame(data=d1)
df2 = pd.DataFrame(data=d2)
df2.set_index('x').join(df1.set_index('x'), on='x', how='left').reset_index()

尝试使用它,您可以将列中已有的值与新值进行比较,然后您可以创建一个 df 剩余值并将其连接到旧的 df

import pandas as pd
import numpy as np

df = pd.DataFrame({'x':[0,0.07,0.1,0.13], 'y':[3,4,6,5]})
new_list = [0, 0.03, 0.07, 0.1, 0.13, 0.17, 0.2]
def diff(new_list, col_list):
    if len(new_list) > len(df['x'].to_list()):
        diff_list = list(set(new_list) - set(df['x'].to_list()))
    else:
        diff_list = list(set(df['x'].to_list()) - set(new_list))
    return diff_list
new_df = pd.DataFrame({'x':diff(new_list,df['x'].to_list()),'y':np.nan})
fin_df = pd.concat([df,new_df]).reset_index(drop=True)
fin_df 
x   y
0   0.00    3.0
1   0.07    4.0
2   0.10    6.0
3   0.13    5.0
4   0.03    NaN
5   0.20    NaN
6   0.17    NaN