Pandas 将 DataFrame2 ROW 添加到 DataFrame1 ROW

Pandas append DataFrame2 ROW to DataFrame1 ROW

我想将第二个 DataFrame (df2) 中的行附加到第一个 DataFrame (df1),具体取决于 df1 中的“isValid”列是否为 [T]rue。

我知道如何遍历 df1 列并搜索 True 值,但不知道如何轻松地从第二个 DataFrame 追加行。本来我的数据大概有1000行40列,需要自动运算。

import pandas

df1 = pandas.read_csv('df1.csv', sep=';')
df2 = pandas.read_csv('df2.csv', sep=';')

print(df1.to_string(), '\n')
print(df2.to_string(), '\n')

columnSeriesObj = df1.iloc[:, 2]
n = 0
k = 0
for i in columnSeriesObj:
    if i == "T":
        print("True in row number", k)
        # APPEND n ROW from df2 to k ROW from df1
        n += 1
    k += 1

print('\n', df1.to_string())

以下是一些测试值:

df1.csv

DataA;DataB;isValid
1568;1104;F
1224;1213;F
1676;1246;F
1279;1489;T
1437;1890;T
1705;1007;F
1075;1720;F
1361;1983;F
1966;1751;F
1938;1564;F
1894;1684;F
1189;1803;F
1275;1138;F
1085;1748;T
1337;1775;T
1719;1975;F
1045;1187;F
1426;1757;F
1410;1363;F
1405;1025;F
1699;1873;F
1777;1464;F
1925;1310;T

df2.csv

Nr;X;Y;Z;A ;B;C
1;195;319;18;qwe;hjk;wsx
2;268;284;23;rty;zxc;edc
3;285;277;36;uio;vbn;rfv
4;143;369;34;asd;mlp;tgb
5;290;247;16;fgh;qaz;yhn

我想在附加后 df1 看起来像这样(来自 Excel 的屏幕截图):

感谢您的任何建议! :D

这样的事情怎么样:
(例如,首先找到重叠的索引值,然后加入数据帧)

import pandas as pd
import numpy as np

df1 = pd.read_csv("df1.csv", sep=';')
df2 = pd.read_csv(r"df2.csv", sep=';')

# find intersecting indices
useidx = np.intersect1d(df2.index, 
                        df1[df1.isValid == 'T'].index)

# join relevant values
df_joined = df1.join(df2.loc[useidx])

df_joined 然后看起来像这样:

>>>      DataA  DataB isValid   Nr      X      Y     Z   A     B    C
>>> 0    1568   1104       F  NaN    NaN    NaN   NaN  NaN  NaN  NaN
>>> 1    1224   1213       F  NaN    NaN    NaN   NaN  NaN  NaN  NaN
>>> 2    1676   1246       F  NaN    NaN    NaN   NaN  NaN  NaN  NaN
>>> 3    1279   1489       T  4.0  143.0  369.0  34.0  asd  mlp  tgb
>>> 4    1437   1890       T  5.0  290.0  247.0  16.0  fgh  qaz  yhn
>>> 5    1705   1007       F  NaN    NaN    NaN   NaN  NaN  NaN  NaN
>>> 6    1075   1720       F  NaN    NaN    NaN   NaN  NaN  NaN  NaN
>>> 7    1361   1983       F  NaN    NaN    NaN   NaN  NaN  NaN  NaN

您可以过滤 df1 中的索引值,其中 isValid 列等于 T,然后使用 [=] 中过滤的索引值更新 df2 的索引12=] 最后 join 它与 df1:

m = df1['isValid'].eq('T')
idx = m[m].index[:len(df2)]
df1.join(df2.set_index(idx)).fillna('')

    DataA  DataB isValid Nr    X    Y   Z   A     B    C
0    1568   1104       F                                
1    1224   1213       F                                
2    1676   1246       F                                
3    1279   1489       T  1  195  319  18  qwe  hjk  wsx
4    1437   1890       T  2  268  284  23  rty  zxc  edc
5    1705   1007       F                                
6    1075   1720       F                                
7    1361   1983       F                                
8    1966   1751       F                                
9    1938   1564       F                                
10   1894   1684       F                                
11   1189   1803       F                                
12   1275   1138       F                                
13   1085   1748       T  3  285  277  36  uio  vbn  rfv
14   1337   1775       T  4  143  369  34  asd  mlp  tgb
15   1719   1975       F                                
16   1045   1187       F                                
17   1426   1757       F                                
18   1410   1363       F                                
19   1405   1025       F                                
20   1699   1873       F                                
21   1777   1464       F                                
22   1925   1310       T  5  290  247  16  fgh  qaz  yhn

我建议如下:

我创建了一些虚拟数据,类似于你的:

import pandas as pd
import random

df = pd.DataFrame({"a": list(range(20)), "b": [random.choice(("T", "F")) for _ in range(20)]})

df2 = pd.DataFrame({"value1": list(range(5)), "nr": list(range(5))})

首先,您在第一个包含递增 ID(“Nr”)的数据框中创建一个新列。为此,请使用 itertools 中的 count 生成器。

from itertools import count

counter = count(start=1)
df["id"] = df.apply(lambda row: next(counter) if row["b"] == "T" else None, axis=1)

之后,您可以使用 merge 方法执行连接。

df.merge(df2, left_on="id", right_on="nr", how="outer")