<pre><code>from ast import literal_eval
</code></pre>
<p>让我们从这里开始:</p>
<pre><code>data=df_merge['PDH_Value'].to_dict()
data={k:v.replace('null','"null"') for k,v in data.items()}
df_merge['PDH_Value']=pd.Series(data)
</code></pre>
<p><strong>解释:</strong></p>
<ul>
<li>在上面的代码中,我们将df_merge['PDH_Value']转换为字符串字典(其中的值是string)</li>
<li>然后我们在dictionary的字符串值中将null替换为“null”,因为如果我们不这样做,我们就无法将该字符串转换为真正的dict类型</li>
<li>然后我们制作一系列数据,并将这些数据分配回df_merge['PDH_Value']</li>
</ul>
<p>然后:</p>
<pre><code>df_merge['PDH_Value']=df_merge['PDH_Value'].where(df_merge['PDH_Value'].str.startswith('{'),"{'catchup':'None'}")
df_merge['PDH_Value']=df_merge['PDH_Value'].astype(str).map(lambda x:literal_eval(x) if x!='nan' else float('NaN'))
df_merge['PDH_Value']=df_merge['PDH_Value'].map(lambda x:x['catchup'])
</code></pre>
<p><strong>解释:</strong></p>
<ul>
<li><p>由于df_merge['PDH_Value']的值仍然是字符串,因此我们正在检查序列中的值,即df_merge['PDH_Value']是否以<code>{</code>开头,或者如果它以<code>{</code>开头,则我们不会对其进行任何更改,但如果它没有开始,则我们将其替换为<code>"{'catchup':'None'}"</code>…换句话说,我们正在将空字符<code>''</code>替换为<code>"{'catchup':'None'}"</code>,因为您只对“catchup”感兴趣</p>
</li>
<li><p>在使用astype()之后,我们将确保所有内容都是字符串,然后通过<code>map()</code>方法将值传递给<code>literal_eval()</code>,因此现在<code>df_merge['PDH_Value']</code>内的字符串将转换为实际的字典</p>
</li>
<li><p>因为它现在是实际的字典,所以我们通过<code>map()</code>方法获取<code>'catchup'</code>键的值</p>
</li>
</ul>
<p>最后:</p>
<pre><code>df_merge['PDH_Value']=df_merge['PDH_Value'].str.title().map({'True':'yes','False':'no','None':float('nan')})
</code></pre>
<p><strong>解释:</strong></p>
<ul>
<li><p>因为我们使用的是<code>str.title()</code>,所以True和False是大写的T和F(第一个字母大写,其余字母小写)</p>
</li>
<li><p>因为您只需要yes和no,并且如果您确定dict中的所有值都是小写的,那么您可以从上述方法中删除<code>str.title()</code>,因此它变为:</p>
</li>
</ul>
<p><code>df_merge['PDH_Value']=df_merge['PDH_Value'].map({'true':'yes','false':'no','None':float('nan')})</code></p>
<ul>
<li>最后,我们通过<code>map()</code>映射值,即类似于替换,您也可以使用<code>replace()</code>代替<code>map()</code>,因此我们将<code>true</code>更改为<code>yes</code>,反之亦然,<code>None</code>更改为<code>NaN</code></li>
</ul>