python - 如何组合具有不同名称的 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_id
和StreamID
实际上是一回事。我拥有的 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'])
但我不确定这是否正确,或者是否有更好的方法来做到这一点。有人可以帮我解决这个问题吗?
非常感谢您提前。
解决方案
我终于通过在检查它们是否存在后逐步重命名错误的列名来解决它,然后将从每个文件创建的每个 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)
它完全解决了名称错误的重复列的问题。希望这会对某人有所帮助。
推荐阅读
- javascript - 在 div 中显示 javascript 数组
- mysql - Averaging based on week count in mysql
- php - array_rand - 我怎样才能得到比数组更多的值?
- barcode - 22位数字的条形码,范围从0-9
- angularjs - 在 angularJS 中调整 textarea 的大小(在 uib-tab 中)
- javascript - JS 文件中的 Vue JS 组件调用函数
- javascript - chrome.storage.sync.get 错误
- excel - 从行上的单元格值添加前缀
- netlogo - 复合对数正态帕累托分布
- python - 将函数应用于 QtextEdit 或 QPlainTextEdit python pyside2