我有兩個串列(來自兩個單獨的 pandas 資料框的列),并且希望在保留順序或基于條件排序的同時找到兩個串列的交集。考慮以下示例:
x = ['0 MO', '1 YR', '10 YR', '15 YR', '2 YR', '20 YR', '3 MO', '3 YR',
'30 YR', '4 YR', '5 YR', '6 MO', '7 YR', '9 MO', 'Country']
y = ['Industry', '3 MO', '6 MO', '9 MO', '1 YR', '2 YR', '3 YR',
'4 YR', '5 YR', '7 YR', '10 YR', '15 YR', '20 YR', '30 YR']
answer = set(x).intersection(y)
變數 answer 產生重疊列,但不保留順序。有沒有辦法對解決方案進行排序,使得答案產生:
answer = ['3 MO', '6 MO', '9 MO', '1 YR', '2 YR', '3 YR',
'4 YR', '5 YR', '7 YR', '10 YR', '15 YR', '20 YR',
'30 YR']
即首先按月(“MO”)和整數對相交串列進行排序,然后按年(“YR”)及其整數排序?
或者,是否有一種 pandas 方法可以通過兩個重疊列的資料幀(保留或宣告順序)獲得相同的結果?
uj5u.com熱心網友回復:
您可以簡單地使用串列推導:
[this_name for this_name in x if this_name in y]
和
[this_name for this_name in y if this_name in x]
uj5u.com熱心網友回復:
我不知道您到底要做什么,但我的回答將針對您描述的用例。如果您想使用 pandas,我認為以下代碼將滿足您的需求。如果您有更復雜的資料,我認為您可能需要更改列型別timedelta以獲得更大的靈活性。在這種情況下,排序是有效的,因為它MO是按字母順序排列的 before YR。
import pandas as pd
df1 = pd.DataFrame({'x': ['0 MO', '1 YR', '10 YR', '15 YR', '2 YR', '20 YR', '3 MO', '3 YR',
'30 YR', '4 YR', '5 YR', '6 MO', '7 YR', '9 MO', 'Country']})
df2 = pd.DataFrame({'y': ['Industry', '3 MO', '6 MO', '9 MO', '1 YR', '2 YR', '3 YR',
'4 YR', '5 YR', '7 YR', '10 YR', '15 YR', '20 YR', '30 YR']})
# drop 'non-standard' data
df1["x"] = df1["x"].apply(lambda x: x if x[0].isdigit() else None)
df2["y"] = df2["y"].apply(lambda x: x if x[0].isdigit() else None)
df1.dropna(inplace=True)
df2.dropna(inplace=True)
# make two columns to sort
df1["value"] = df1["x"].apply(lambda x: int(x[:-2]))
df1["unit"] = df1["x"].apply(lambda x: x[-2:])
df2["value"] = df2["y"].apply(lambda x: int(x[:-2]))
df2["unit"] = df2["y"].apply(lambda x: x[-2:])
# sort by unit and value
df1 = df1.sort_values(by=["unit", "value"]).drop("x", axis=1)
df2 = df2.sort_values(by=["unit", "value"]).drop("y", axis=1)
# merge
df = pd.merge(df1, df2, on=["unit", "value"])
df["result"] = df.apply(lambda x: str(x["value"]) " " x["unit"], axis=1)
df.drop(["unit", "value"], axis=1, inplace=True)
df
uj5u.com熱心網友回復:
您可以通過將自定義函式作為鍵傳遞來使用sorted函式進行排序answer。由于您想首先按 MO 或 YR 排序,然后按整數值排序,因此您可以在空白處拆分并按第二部分(MO 或 YR)進行評估,然后是第一部分的整數值。
def sorter(x):
s = x.split()
return (s[1],int(s[0]))
out = sorted(set(x).intersection(y), key=sorter)
輸出:
['3 MO', '6 MO', '9 MO', '1 YR', '2 YR', '3 YR', '4 YR', '5 YR', '7 YR', '10 YR', '15 YR', '20 YR', '30 YR']
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/406343.html
標籤:
