<p>在我看来,最好是从<code>dict</code>创建新列:</p>
<pre><code>d = {'bpi': {'EUR': {'code': 'EUR', 'symbol': '&euro;', 'rate': '3,671.8281', 'description': 'Euro', 'rate_float': 3671.8281}, 'GBP': {'code': 'GBP', 'symbol': '&pound;', 'rate': '3,397.8616', 'description': 'British Pound Sterling', 'rate_float': 3397.8616}, 'USD': {'code': 'USD', 'symbol': '&#36;', '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'}}
</code></pre>
<hr/>
<pre><code>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 &euro;
GBP GBP British Pound Sterling 3397.8616 3397.8616 &pound;
USD USD United States Dollar 4378.8400 4378.8400 &#36;
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
</code></pre>
<p>或者使用<a href="http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.json.json_normalize.html" rel="nofollow noreferrer">^{<cd2>}</a>如<a href="https://stackoverflow.com/a/43228551/2901002">solution</a>与原始json数据类似(如果可能):</p>
<pre><code>df = json_normalize(d)
print (df)
</code></pre>
<p>上次按<a href="http://pandas.pydata.org/pandas-docs/stable/indexing.html#boolean-indexing" rel="nofollow noreferrer">^{<cd3>}</a>筛选:</p>
<pre><code>#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 &euro; NaT
</code></pre>