当前位置: 首页 > 知识库问答 >
问题:

只保留一个数据帧的行,该数据帧的某些列的值也显示在另一个数据帧中

尚宏硕
2023-03-14

我有两个数据帧,它们共享多个公共列,如下所示:

第一个df1

    TG_ID   ORG_NO  TG_CAP  DATA_DATE   METER_ID    CONS_SORT   WIRING_MODE T_FACTOR    PHASE_FLAG  I1  ... I87 I88 I89 I90 I91 I92 I93 I94 I95 I96
0   1646176 134010902   315.0   20200801    8200000036483255    06  3   60.0    1   0.606333    ... 0.480667    0.524333    0.399333    0.430667    0.386667    0.396667    0.371333    0.314333    0.336333    0.289000
1   1646176 134010902   315.0   20200801    8200000036483255    06  3   60.0    2   0.606333    ... 0.480667    0.524333    0.399333    0.430667    0.386667    0.396667    0.371333    0.314333    0.336333    0.289000
2   1646176 134010902   315.0   20200801    8200000036483255    06  3   60.0    3   0.606333    ... 0.480667    0.524333    0.399333    0.430667    0.386667    0.396667    0.371333    0.314333    0.336333    0.289000
6   1646178 134010902   200.0   20200801    8200000033404961    06  3   60.0    1   0.338333    ... 0.199333    0.215000    0.191667    0.248333    0.154000    0.240000    0.129333    0.224667    0.152000    0.198000
7   1646178 134010902   200.0   20200801    8200000033404961    06  3   60.0    2   0.338333    ... 0.199333    0.215000    0.191667    0.248333    0.154000    0.240000    0.129333    0.224667    0.152000    0.198000
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1117    900028797849    134010902   400.0   20200801    8200000035893592    06  3   120.0   2   0.286667    ... 0.192000    0.196667    0.203667    0.171000    0.140333    0.154333    0.126000    0.144000    0.144667    0.131333
1118    900028797849    134010902   400.0   20200801    8200000035893592    06  3   120.0   3   0.286667    ... 0.192000    0.196667    0.203667    0.171000    0.140333    0.154333    0.126000    0.144000    0.144667    0.131333
1119    900029405841    134010902   100.0   20200801    8200000036482415    06  3   30.0    1   0.060000    ... 0.088000    0.127667    0.084333    0.084333    0.123333    0.088000    0.084000    0.084333    0.084333    0.083667
1120    900029405841    134010902   100.0   20200801    8200000036482415    06  3   30.0    2   0.060000    ... 0.088000    0.127667    0.084333    0.084333    0.123333    0.088000    0.084000    0.084333    0.084333    0.083667
1121    900029405841    134010902   100.0   20200801    8200000036482415    06  3   30.0    3   0.060000    ... 0.088000    0.127667    0.084333    0.084333    0.123333    0.088000    0.084000    0.084333    0.084333    0.083667

而第二个df2


    TG_ID   ORG_NO  DATA_DATE   METER_ID    CONS_SORT   WIRING_MODE PHASE_FLAG  U1  U2  U3  ... U87 U88 U89 U90 U91 U92 U93 U94 U95 U96
27  1646176 134010901   20200801    8200000034727355    04  1   1   248.7   247.4   248.8   ... 251.0   251.4   251.5   246.6   248.1   247.8   248.0   247.8   248.0   246.8
28  1646176 134010902   20200801    8200000032252506    05  1   1   248.5   247.8   248.9   ... 251.0   251.5   249.3   246.8   248.2   247.6   247.2   247.9   249.2   246.9
30  1646176 134010902   20200801    8200000031675334    05  1   1   248.5   248.3   250.4   ... 253.0   251.9   248.4   249.1   248.5   247.6   247.6   246.9   245.9   247.5
32  1646176 134010902   20200801    8200000032855108    05  1   1   240.9   241.1   242.8   ... 248.8   248.8   246.1   245.9   246.7   247.0   245.2   246.9   244.4   243.6
34  1646176 134010902   20200801    8200000032861235    05  1   1   241.8   242.7   243.9   ... 249.8   249.5   246.4   246.2   246.9   247.0   245.7   247.6   244.7   244.0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
28323   900028797849    134010902   20200801    8200000032252390    05  1   1   229.6   231.3   231.2   ... 236.0   234.4   232.5   232.7   231.8   233.3   233.1   232.4   229.5   229.3
28324   900028797849    134010902   20200801    8200000035146454    05  1   1   233.2   232.5   233.1   ... 236.8   237.3   237.5   233.8   234.2   233.4   233.6   232.3   233.3   233.7
28325   900028797849    134010902   20200801    8200000035113338    05  1   1   233.1   232.6   233.0   ... 237.0   237.2   234.7   233.7   234.3   233.4   233.6   232.2   232.7   233.8
28326   900028797849    134010902   20200801    8200000035132418    05  1   1   233.7   233.4   233.8   ... 237.3   237.7   234.9   234.3   234.4   233.9   233.6   232.0   233.2   233.9
28327   900028797849    134010902   20200801    8200000035138508    05  1   1   231.9   233.3   233.4   ... 237.7   236.1   234.3   234.1   233.5   233.8   233.6   233.8   231.3   231.1

我想保留df2中的行,其列中的值“TG\u ID”、“ORG\u NO”和“DATA\u DATE”也存在于df1中。例如,df2的第27行有值“1646176”、“134010901”和“20200801”,对于“TG\u ID”、“ORG\u NO”和“DATA\u DATE”,这些值并不都存在于df1(因为df1只对“ORG\u NO”列有值),所以应该过滤掉df2的第27行。另一方面,应保留df2的第28行,因为值“1646176”、“134010902”和“20200801”也出现在df1中。

我尝试过如下合并:

df3 = df2.merge(df1, on = ["TG_ID", "ORG_NO", "DATA_DATE"])

但是它提供了比df2更多的行和列,这是不期望的。

下面对join()的调用只是给出了一个错误

len(left_on)必须等于“right”索引中的级别数

df3 = df2.join(df1, on = ["TG_ID", "ORG_NO", "DATA_DATE"])

我怎样才能恰当地达到我的要求?


共有1个答案

姚永年
2023-03-14

您可以将列TG\u IDORG\u NODATA\u DATE设置为数据帧df1df2中的多索引,然后使用多索引。isin测试数据帧df1索引中df2索引的成员资格,以创建布尔掩码

c =  ["TG_ID", "ORG_NO", "DATA_DATE"]
mask = df2.set_index(c).index.isin(df1.set_index(c).index)
>>> df2[mask]

              TG_ID     ORG_NO DATA_DATE          METER_ID CONS_SORT WIRING_MODE PHASE_FLAG     U1     U2     U3  ...    U87    U88    U89    U90    U91    U92    U93    U94    U95    U96
28          1646176  134010902  20200801  8200000032252506        05           1          1  248.5  247.8  248.9  ...  251.0  251.5  249.3  246.8  248.2  247.6  247.2  247.9  249.2  246.9
30          1646176  134010902  20200801  8200000031675334        05           1          1  248.5  248.3  250.4  ...  253.0  251.9  248.4  249.1  248.5  247.6  247.6  246.9  245.9  247.5
32          1646176  134010902  20200801  8200000032855108        05           1          1  240.9  241.1  242.8  ...  248.8  248.8  246.1  245.9  246.7  247.0  245.2  246.9  244.4  243.6
34          1646176  134010902  20200801  8200000032861235        05           1          1  241.8  242.7  243.9  ...  249.8  249.5  246.4  246.2  246.9  247.0  245.7  247.6  244.7  244.0
...             ...        ...       ...               ...       ...         ...        ...    ...    ...    ...  ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...
28323  900028797849  134010902  20200801  8200000032252390        05           1          1  229.6  231.3  231.2  ...  236.0  234.4  232.5  232.7  231.8  233.3  233.1  232.4  229.5  229.3
28324  900028797849  134010902  20200801  8200000035146454        05           1          1  233.2  232.5  233.1  ...  236.8  237.3  237.5  233.8  234.2  233.4  233.6  232.3  233.3  233.7
28325  900028797849  134010902  20200801  8200000035113338        05           1          1  233.1  232.6  233.0  ...  237.0  237.2  234.7  233.7  234.3  233.4  233.6  232.2  232.7  233.8
28326  900028797849  134010902  20200801  8200000035132418        05           1          1  233.7  233.4  233.8  ...  237.3  237.7  234.9  234.3  234.4  233.9  233.6  232.0  233.2  233.9
28327  900028797849  134010902  20200801  8200000035138508        05           1          1  231.9  233.3  233.4  ...  237.7  236.1  234.3  234.1  233.5  233.8  233.6  233.8  231.3  231.1
 类似资料:
  • 我有两个数据帧,它们的列名相同,但行数不同。第一个数据帧(a)看起来与此类似: 注:站点5、6、8和12故意丢失。 第二个数据帧(b)看起来像这样: 我想要实现的是: 在那里我注入(我肯定有一个更好的术语)数据帧b到数据帧a的数据,但是我想用零替换b中的任何NAs,并保持a中的NAs不变。 我发现并尝试了这个代码: 但它会带来NAs。我考虑先将NAs替换为零,但即使如此,它也会抹去我目前在数据帧a

  • 我有两个Dataframes一个与日期集(df1)和另一个与emp_ids集(df2)。我试图创建一个新的Dataframe,这样df2中的每个emp_id都被标记为df1中的每个日期。 下面给出了我的数据帧的外观 df1 df2 预期产出: 我将日期列转换为字符串,并尝试执行以下操作,但返回的数据框为空 我尝试做

  • 我有两个数据框,都包含英文和中文单词字符串,我想知道其中一个是另一个的子集:

  • 我有两个数据帧df1和df2。df1就像一个具有以下值的字典 df2具有以下值: 我想基于df1数据帧中的,将df2拆分为3个新的数据帧。 日期,TLRA_权益栏应位于数据框 预期产出: > 数据帧 消费者,非周期性数据帧 请让我知道如何有效地做。我想做的是连接列名,例如,然后根据列名的前半部分分割数据帧。 代码: 但这很复杂。需要更好的解决方案。

  • 我有两个数据帧df1和df2 df1如下 df2就像 我想根据df2中与df1中的列名匹配的单元格值将值从df1复制到df2,所以我的df3应该看起来像 df3 基本上,我想根据df2的单元格值(df1中的列名)从df1复制df2中的列 如果它仍然令人困惑,请告诉我

  • 情况: 两个数据帧(df1和df2)具有相同的三个索引,例如“A”、“B”、“C”。df1和df2的列数不同。df1和df2中的所有单元格都填充了float类型的数据。 DF1: DF2: 目标: 从df2中选择的列(例如“BBB”)与df1的每列相加后,结果应存储在新的数据帧(df_new)中。df_new的格式应为df1(列数和行数),并具有与df1相同的列名和索引。 new_df: 我的做法