【问题标题】:How to populate a column base on another dataframe column in Python?如何根据 Python 中的另一个数据框列填充列?
【发布时间】:2021-09-24 21:17:04
【问题描述】:

前几天我问了一个类似的问题,但无法使用我在当前问题中收到的建议。

如何使用与“port_df”相同的代码位置填充 df 中的“数量”列?

dataA = {'ID': ['1407','1726','2910','1890'],
        'quanitity': ['nan','nan','nan','nan'],
        'NetRate': ['nan','nan','nan','nan'],
        'GrossRate': [150,0,238,0],
        'PositionClass': ['L','L','S','S'],
        }

df = pd.DataFrame(dataA, columns = ['ID', 'quanitity', 'NetRate', 'GrossRate','PositionClass' ])

df
     ID  quanitity  NetRate GrossRate   PositionClass
0   1407    nan      nan       150      L
1   1726    nan      nan       0        L
2   2910    nan      nan       238      S
3   1890    nan      nan       0        S

port = {'Symbol': ['1407','1726','3214','2910','1890','5614','4578'],
        'Position': ['56461','441','31316','546','105','0','nan'],
        'NetRate': ['nan','nan','nan','nan','nan','nan','nan'],
        'PositionClass': ['L','L','S','S','L','S','S'],
        }
port_df = pd.DataFrame(port, columns = ['Symbol', 'Position', 'NetRate', 'PositionClass' ])
port_df

   Symbol   Position    NetRate PositionClass
0   1407    56461       nan     L
1   1726    441         nan     L
2   3214    31316       nan     S
3   2910    546         nan     S
4   1890    105         nan     L
5   5614    0           nan     S
6   4578    nan         nan     S

我尝试了这两个代码。但无法得到我想要的结果

import numpy as np
import pandas as pd

df['quanitity'] = (np.where(df['ID'] == port_df['Symbol'], 
                            df['ID'].map(port_df.set_index('Symbol')['Position']),
                            np.nan))

df.loc[df['ID'].isin(port_df.Symbol),['quanitity']] = port_df['Position']

感谢任何帮助。

【问题讨论】:

  • 这能回答你的问题吗? Pandas Merging 101
  • 供映射使用df['quantity']=df['ID'].map(port_df.set_index('Symbol')['Position'])
  • @K saman 它在我这边工作正常然后使​​用df.merge(port_df[['Symbol','Position']],left_on='ID',right_on='Symbol',how='left')
  • 是的,它成功了。谢谢@AnuragDabas

标签: python pandas dataframe conditional-statements missing-data


【解决方案1】:

在您的代码后添加这些行:

my_dict = dict(zip(port['Symbol'], port['Position']))
df['quanitity'] = [my_dict[id] for id in df['ID']]

解决方案:

import pandas as pd
dataA = {'ID': ['1407','1726','2910','1890'],
        'quanitity': ['nan','nan','nan','nan'],
        'NetRate': ['nan','nan','nan','nan'],
        'GrossRate': [150,0,238,0],
        'PositionClass': ['L','L','S','S'],
        }

df = pd.DataFrame(dataA, columns = ['ID', 'quanitity', 'NetRate', 'GrossRate','PositionClass' ])

port = {'Symbol': ['1407','1726','3214','2910','1890','5614','4578'],
        'Position': ['56461','441','31316','546','105','0','nan'],
        'NetRate': ['nan','nan','nan','nan','nan','nan','nan'],
        'PositionClass': ['L','L','S','S','L','S','S'],
        }
port_df = pd.DataFrame(port, columns = ['Symbol', 'Position', 'NetRate', 'PositionClass' ])

# Add these two lines
my_dict = dict(zip(port['Symbol'], port['Position']))
df['quanitity'] = [my_dict[id] for id in df['ID']]

print(df)

输出

     ID quanitity NetRate  GrossRate PositionClass
0  1407     56461     nan        150             L
1  1726       441     nan          0             L
2  2910       546     nan        238             S
3  1890       105     nan          0             S

【讨论】:

    猜你喜欢
    • 2020-11-26
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    相关资源
    最近更新 更多