首页 > 解决方案 > 如何组合具有不同名称的 2 列以用第二个的值填充第一个的空值?

问题描述

我有这个df:

           country  customer_id   invoice   price   stream_id   times_viewed    year    month   day total_price StreamID    TimesViewed
0   United Kingdom  13085.0        489434    6.95       85048           12.0    2017       11   28          NaN      NaN            NaN
1   United Kingdom  NaN            489597    8.65       22130            1.0    2017       11   28          NaN      NaN            NaN
2   United Kingdom  NaN            489597    1.70       22132            6.0    2017       11   28          NaN     NaN              NaN
3   United Kingdom  NaN            489597    1.70       22133            4.0    2017       11   28          NaN     NaN             NaN
4   United Kingdom  NaN            489597    0.87       22134            1.0    2017       11   28          NaN     NaN             NaN

stream_idStreamID实际上是一回事。我拥有的 df 要大得多,它是由块创建的。问题来了,当读取这些块时,其中一些具有列名,stream_id而另一些则具有列名StreamID,因此使用pd.concat最终结果将所有块放在一起时看起来像这样。

我想做的是用最后一个不为空时StreamID的值填充空值。stream_id我不确定这是否是正确的方法,或者是否有更有效的方法来解决这个问题。

times_viewed和列也出现了同样的问题TimesViewed,因此同样的解决方案也适用于这一列。

我试过np.where这样使用:

df['new_col'] = np.where(df['StreamID'].isnull(), df['stream_id'], df['StreamID'])

但我不确定这是否正确,或者是否有更好的方法来做到这一点。有人可以帮我解决这个问题吗?

非常感谢您提前。

标签: pythonpython-3.xpandasdataframenull

解决方案


我终于通过在检查它们是否存在后逐步重命名错误的列名来解决它,然后将从每个文件创建的每个 df 添加到最后连接的临时列表中,给出最终结果:

import glob
import pandas as pd

files = sorted(glob.glob(os.getcwd() + "/data_dir/*.json"))

df_list = []

for i in files:

    temp_df = pd.read_json(i)

    if 'StreamID' in temp_df.columns or 'total_price' in temp_df.columns or 'TimesViewed' in temp_df.columns:

        temp_df.rename(columns = {'StreamID': 'stream_id', 'total_price': 'price', 'TimesViewed': 'times_viewed'}, inplace = True)

    df_list.append(temp_df)

df = pd.concat(df_list, axis = 0)

它完全解决了名称错误的重复列的问题。希望这会对某人有所帮助。


推荐阅读