【问题标题】:Picking out specific values from a dataframe?从数据框中挑选出特定的值?
【发布时间】:2017-08-27 14:26:06
【问题描述】:

我有一个从 json url 创建的数据框。它有两列,bpi 和 time。 bpi 值是前三行的字典,时间值是 NaN。最后三行是 bpi 的 NaN 和时间的 timedate 值。我想返回第 3 行第 1 列和第 4 行第 2 列。复杂的部分是从第 3 行第 1 列中,我只想从字典中选择特定的键、值对。我怎样才能做到这一点?

[in] print(btc)
[out]
                                                          bpi  \
EUR         {'code': 'EUR', 'symbol': '€', 'rate': '3...   
GBP         {'code': 'GBP', 'symbol': '£', 'rate': '...   
USD         {'code': 'USD', 'symbol': '$', 'rate': '4,...   
updated                                                   NaN   
updatedISO                                                NaN   
updateduk                                                 NaN   

                                 time  
EUR                               NaN  
GBP                               NaN  
USD                               NaN  
updated     Aug 27, 2017 14:07:00 UTC  
updatedISO  2017-08-27T14:07:00+00:00  
updateduk   Aug 27, 2017 at 15:07 BST  

我只想要美元字典中的rate,加上time 列中的updated 值。

每个日期值的输出应为一行 - 后跟一列列出 rates

这是使用pandas .to_dict修改df时的输出

[in]
btc_dict = btc.to_dict()

print(btc_dict)
[out]
{'bpi': {'EUR': {'code': 'EUR', 'symbol': '€', 'rate': '3,671.8281', 'description': 'Euro', 'rate_float': 3671.8281}, 'GBP': {'code': 'GBP', 'symbol': '£', 'rate': '3,397.8616', 'description': 'British Pound Sterling', 'rate_float': 3397.8616}, 'USD': {'code': 'USD', 'symbol': '$', 'rate': '4,378.8400', 'description': 'United States Dollar', 'rate_float': 4378.84}, 'updated': nan, 'updatedISO': nan, 'updateduk': nan}, 'time': {'EUR': nan, 'GBP': nan, 'USD': nan, 'updated': 'Aug 27, 2017 14:07:00 UTC', 'updatedISO': '2017-08-27T14:07:00+00:00', 'updateduk': 'Aug 27, 2017 at 15:07 BST'}}

【问题讨论】:

  • 如果您能说出您希望输出的样子会很有帮助
  • 好的,我添加了所需的输出格式 - 但我无法显示它应该是什么样子的实际描述。
  • 您可以打印df.to_dict() 并粘贴到这里吗?您的数据不适合复制粘贴,我们无法使用它。
  • @cᴏʟᴅsᴘᴇᴇᴅ 我编辑了我的问题以包含使用dt.to_dict()转换数据帧时的输出
  • 您能解释一下您希望这些值在输出中的样子吗?

标签: python pandas dictionary dataframe


【解决方案1】:

IIUC,您可以使用 df.loc 并访问这些值,如下所示:

r = df.loc['USD', 'bpi']['rate']
y = df.loc['updated', 'time']

df = pd.DataFrame({'btc_price (USD)': [r], 'time' : [y]}) 
print(df)

  btc_price (USD)                       time
0      4,378.8400  Aug 27, 2017 14:07:00 UTC

要保存到 CSV,您可以使用 df.to_csv:

df.to_csv('out.csv')

如果您以后必须附加到同一个数据框,您首先要创建一个新的数据框并附加到您现有的 CSV 文件中:

df_new = pd.DataFrame([[new_rate, new_time]], columns=['btc_price (USD)', 'time'])
with open('out.csv', 'a') as f:
    df_new.to_csv(f, header=False)

【讨论】:

  • 我怎样才能将这些值放入列表或字典中?我的目标是从初始记录开始,然后在每次调用 url 请求时向 csv 添加一个新行
  • @zsad512 已编辑。
  • 谢谢@COLDSPEED,但仍然缺少一项重要功能。我想做的是创建一个 csv 文件,该文件不断用新值更新,而不会覆盖旧值....有没有方便的方法来做到这一点?我最终会将脚本编程为每分钟自动运行,并且 csv 每次都应该增长......但是,我从中提取的 json 文件将始终只产生一行
  • @zsad512 我提到了如何根据需要附加到 csv。
【解决方案2】:

在我看来,最好的办法是从dicts 创建新列:

d = {'bpi': {'EUR': {'code': 'EUR', 'symbol': '€', 'rate': '3,671.8281', 'description': 'Euro', 'rate_float': 3671.8281}, 'GBP': {'code': 'GBP', 'symbol': '£', 'rate': '3,397.8616', 'description': 'British Pound Sterling', 'rate_float': 3397.8616}, 'USD': {'code': 'USD', 'symbol': '$', 'rate': '4,378.8400', 'description': 'United States Dollar', 'rate_float': 4378.84}, 'updated': np.nan, 'updatedISO': np.nan, 'updateduk': np.nan}, 'time': {'EUR': np.nan, 'GBP': np.nan, 'USD': np.nan, 'updated': 'Aug 27, 2017 14:07:00 UTC', 'updatedISO': '2017-08-27T14:07:00+00:00', 'updateduk': 'Aug 27, 2017 at 15:07 BST'}}

df = pd.DataFrame(d)
#replace NaNs to {}
df['bpi'] = df['bpi'].fillna(pd.Series([{}], index=df.index))

#new df by constructor, join column time last
df1 = pd.DataFrame(df['bpi'].values.tolist(), index=df.index).join(df['time'])
#convert rate column to float 
df1['rate'] = df1['rate'].replace(',','',regex=True).astype(float)
#convert time column to datetimes
df1['time'] = pd.to_datetime(df1['time'])
print (df1)
           code             description       rate  rate_float   symbol  \
EUR         EUR                    Euro  3671.8281   3671.8281   €   
GBP         GBP  British Pound Sterling  3397.8616   3397.8616  £   
USD         USD    United States Dollar  4378.8400   4378.8400    $   
updated     NaN                     NaN        NaN         NaN      NaN   
updatedISO  NaN                     NaN        NaN         NaN      NaN   
updateduk   NaN                     NaN        NaN         NaN      NaN   

                          time  
EUR                        NaT  
GBP                        NaT  
USD                        NaT  
updated    2017-08-27 14:07:00  
updatedISO 2017-08-27 14:07:00  
updateduk  2017-08-27 15:07:00  

如果可能的话,或者像 solution 一样使用 json_normalize 和原始 json 数据:

df = json_normalize(d)
print (df)

boolean indexing的最后过滤器:

#sample
df3 = df1[(df1['code'] == 'EUR') & (df1['rate'] > 1000)]
print (df3)
    code description       rate  rate_float  symbol time
EUR  EUR        Euro  3671.8281   3671.8281  €  NaT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多