在中介步骤中引用链式熊猫DF

时间:2019-08-11 04:18:55

标签: python pandas dataframe

我正在尝试将两个数据帧合并在一起,并在一系列链接操作中删除重叠的列:

# people.head()
  | name    | id
  |---------|----
0 | Jacob   | 150
1 | Richard | 160
2 | John    | 230
3 | Kate    | 420
4 | Hugo    | 1080

# age.head()
  | age  | id
  |------|---
0 | 1024 | 15
1 | 128  | 16
2 | 56   | 23
3 | 32   | 42
4 | 24   | 108

combined = people.join(age, lsuffix='_TO_DROP_')
# combined.head()
  | name    | age  | id  | id_TO_DROP
  |---------|------|-----|-----------
0 | Jacob   | 1024 | 15  | 150
1 | Richard | 128  | 16  | 160
2 | John    | 56   | 23  | 230
3 | Kate    | 32   | 42  | 420
4 | Hugo    | 24   | 108 | 1080

我现在可以删除由join引起的任何重复的列

combined.drop(columns=[col for col in combined.columns if col.endswith('_TO_DROP_'])

是否可以通过链接joindrop操作来做到这一点?

people\
  .join(age, lsuffix='_TO_DROP_')\
  .drop(columns=[col for col in INTERMED_DF.columns if col.endswith('_TO_DROP_')])

具体地,在链接的drop调用中,如何访问上一个(链接的)join调用的输出?

编辑

我的用例的另一个细节:重叠的列不完全对齐。应该在其上连接数据的列是数据框架索引,因此在我的示例中,仅在id列上进行合并(或连接)将无法实现我想要的功能。

3 个答案:

答案 0 :(得分:2)

通过获取difference并在加入列表时将该列表传递到df中来尝试查找不重叠的列

people=pd.DataFrame(data={"name":["jacob","richard"],
                     "id":[15,6]})
age = pd.DataFrame(data={"age":[1024,128],
                        "id":[15,6]})

cols_to_use = age.columns.difference(people.columns)
combined = people.join(age[cols_to_use])

    name    id  age
0   jacob   15  1024
1   richard  6  128

答案 1 :(得分:2)

这是另一种方式:

我正在将people.join(age, lsuffix='_TO_DROP_').filter(regex='^(?!.*TO_DROP_)') df.filter()链接起来,后者带有一个正则表达式参数:

  

regex:字符串(正则表达式)   保持标签远离re.search(regex,label)== True

的轴
       name     age    id
0    Jacob      1024     15
1    Richard    128      16
2    John       56       23
3    Kate       32       42
4    Hugo       24      108

public class KeyValueDto
    {
        public int Key { get; set; }
        public object Value { get; set; }
    }

public class KeyValueDto
    {
        public string Key { get; set; }
        public object Value { get; set; }
    }

答案 2 :(得分:1)

根据熊猫文档https://pandas.pydata.org/pandas-docs/version/0.24.2/reference/api/pandas.DataFrame.join.html

private ListNode merge(ListNode list1, ListNode list2) { ListNode dummy = new ListNode(0); ListNode curr = dummy; while (list1 != null && list2 != null) { if (list1.val < list2.val) { curr.next = list1; list1 = list1.next; } else { curr.next = list2; list2 = list2.next; } curr = curr.next; } if (list1 == null) { curr.next = list2; } else { curr.next = list1; } return dummy.next; } 应该可以工作