簡體   English   中英

如何將一個數據框中的列表列與另一數據框中的字符串列連接在一起?

[英]How to join a column of lists in one dataframe with a column of strings in another dataframe?

我有兩個數據框。 第一個(稱為A)稱為列(稱為col1),其元素為字符串列表。 另一個(稱為B)稱為列(稱為“ col2”),其元素為字符串。 我想在B.col2在A.col1中的列表中的這兩個數據幀之間進行聯接。 這是一對多聯接。

另外,我需要該解決方案具有可伸縮性,因為我想將兩個數據幀與成千上萬的行連接在一起。

我嘗試串聯A.col1中的值並創建一個新列(我們將其稱為“ col3”)並加入以下條件:A.col3.contains(B.col2)。 但是,我的理解是,這種情況觸發了兩個數據框之間的笛卡爾積,考慮到數據框的大小,我無法承受。

def joinIds(IdList):
  return "__".join(IdList)
joinIds_udf = udf(joinIds)

pnr_corr = pnr_corr.withColumn('joinedIds', joinIds_udf(pnr_corr.pnrCorrelations.correlationPnrSchedule.scheduleIds)

pnr_corr_skd = pnr_corr.join(skd, pnr_corr.joinedIds.contains(skd.id), how='inner')

這是我想到的聯接示例:

dataframe A:
listColumn
["a","b","c"]
["a","b"]
["d","e"]

dataframe B:
valueColumn
a
b
d

output:
listColumn      valueColumn
["a","b","c"]   a
["a","b","c"]   b
["a","b"]       a
["a","b"]       b
["d","e"]       d

我不知道是否有一種有效的方法來做到這一點,但這給出了正確的輸出:

import pandas as pd
from itertools import chain

df1 = pd.Series([["a","b","c"],["a","b"],["d","e"]])
df2 = pd.Series(["a","b","d"])

result = [ [ [el2,list1] for el2 in df2.values if el2 in list1 ] 
                         for list1 in df1.values ]
result_flat = list(chain(*result))

result_df = pd.DataFrame(result_flat)

你得到:

In [26]: result_df
Out[26]:
   0          1
0  a  [a, b, c]
1  b  [a, b, c]
2  a     [a, b]
3  b     [a, b]
4  d     [d, e]

另一種方法是使用pandas> = 0.25中的新explode()方法並像這樣合並:

import pandas as pd

df1 = pd.DataFrame({'col1': [["a","b","c"],["a","b"],["d","e"]]})
df2 = pd.DataFrame({'col2': ["a","b","d"]})

df1_flat = df1.col1.explode().reset_index()
df_merged = pd.merge(df1_flat,df2,left_on='col1',right_on='col2')

df_merged['col2'] = df1.loc[df_merged['index']].values
df_merged.drop('index',axis=1, inplace=True)

這給出了相同的結果:

  col1       col2
0    a  [a, b, c]
1    a     [a, b]
2    b  [a, b, c]
3    b     [a, b]
4    d     [d, e]

怎么樣:

df['col1'] = [df['col1'].values[i] + [df['col2'].values[i]] for i in range(len(df))]

其中“ col1”是字符串列表,“ col2”是字符串。

如果您不再希望使用以下命令,也可以刪除“ col2”:

df = df.drop('col2',axis=1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM