【问题标题】:Pandas append DataFrame2 ROW to DataFrame1 ROWPandas 将 DataFrame2 ROW 附加到 DataFrame1 ROW
【发布时间】:2021-05-01 11:47:43
【问题描述】:

我想将第二个 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

【问题讨论】:

    标签: python pandas merge append row


    【解决方案1】:

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

    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
    

    【讨论】:

      【解决方案2】:

      您可以过滤df1 中的索引值,其中列isValid 等于T,然后使用来自df1 的过滤索引值更新df2 的索引,最后使用join 更新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
      

      【讨论】:

        【解决方案3】:

        我建议如下:

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

        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")
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-01
          • 2021-03-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多