Match "df['items']" values with "df1" columns & if values match, store matched value in new dataframe "out", so the expected o/p as below

Viewed 44

I have tried this below code, values matched but result stored under same column i.e, items. I converted df1 columns into variables and match with df. But I want result in new dataframe out:

for ticker in tickers:
 dfs = df1[df1["ticker"] == ticker]
 asset = str(int(dfs['asset'].values[0]))
 debt = str(int(dfs['debt'].values[0]))
 debtc = str(int(dfs['debtc'].values[0]))
 
 data = [ticker, asset, debt, debtc]
 def checkIfValuesExists1(df, ticker):
  for ele in ticker:
   if ele in df['items'].values:
    out[ele] = data      
   return out
 out = checkIfValuesExists1(df, data)

My current output is:

out:

ticker items
AAPL 4564
MSFT 7778
GOOGL 7654

df:

ticker items
AAPL 4564
MSFT 7778
GOOGL 7654

df1:

ticker asset debt debtc
AAPL 4564 9674 9755
MSFT 4477 7778 6545
GOOGL 5675 5535 7654

Expected output i.e, out:

ticker asset debt debtc
AAPL 4564
MSFT 7778
GOOGL 7654
1 Answers

Use eq to identify value equality in a vectorised way and use where to mask NaN values.

df = pd.Series([4564, 7778, 7654], index=["AAPL", "MSFT", "GOOGL"])

df1 = pd.DataFrame(
    {
        "asset": [4564, 4477, 5675],
        "debt": [9674, 7778, 5535],
        "debtc": [9755, 6545, 7654],
    },
    index=["AAPL", "MSFT", "GOOGL"],
)


df1.where(df1.eq(df, axis=0))
Related