有一个数据帧,我想更新列的子集,其长度与正在更新的列数相同:
>>> df = pd.DataFrame(np.random.randint(0,5,(6, 2)), columns=['col1','col2'])
>>> df
col1 col2
0 1 0
1 2 4
2 4 4
3 4 0
4 0 0
5 3 1
>>> df.loc[:,['col1','col2']] = pd.Series([0,1])
...
ValueError: shape mismatch: value array of shape (6,) could not be broadcast to indexing result of shape (2,6)
Run Code Online (Sandbox Code Playgroud)
然而,它失败了,我可以使用list做同样的事情:
>>> df.loc[:,['col1','col2']] = list(pd.Series([0,1]))
>>> df
col1 col2
0 0 1
1 0 1
2 0 1
3 0 1
4 0 1
5 0 1
Run Code Online (Sandbox Code Playgroud)
你能帮我理解,为什么系列更新失败了?我必须进行一些特殊的重塑吗?
我正在尝试使用 pandas 实现增量数据导入。
我有两个数据帧:df_old(原始数据,之前加载)和df_new(新数据,与df_old合并)。
df_old/df_new 中的数据在多个列上是唯一的(为简单起见,我们只说 2:key1 和 key2)。其他列是要合并的数据,可以说,它们也只是其中的 2 列:val1 和 val2。
除此之外,还有一列需要注意:change_id - 它会随着每个新条目覆盖旧条目而增加
导入的逻辑非常简单:
如果 df_new 中存在 df_old 中存在的密钥对,则:
2a) 如果 df_old 和 df_new 中的对应值相同,则应保留旧值
2b) 如果 df_old 和 df_new 中的对应值不同,则 df_new 中的值应替换 df_old 中的旧值
无需关心 dala 删除(如果 df_old 中存在某些数据,但 df_new 中不存在)
到目前为止,我想出了两种不同的解决方案:
>>> df_old = pd.DataFrame([['A1','B2',1,2,1],['A1','A2',1,3,1],['B1','A2',1,3,1],['B1','B2',1,4,1],], columns=['key1','key2','val1','val2','change_id'])
>>> df_old.set_index(['key1','key2'], inplace=True)
>>> df_old
val1 val2 change_id
key1 key2
A1 B2 1 2 1
A2 1 3 1
B1 A2 1 3 …Run Code Online (Sandbox Code Playgroud) 我有一个表示日期的字符串列表:
>>> dates
['14.9.2016',
'13.9.2016',
'12.9.2016',
'11.9.2016',
'10.9.2016',
'9.9.2016',
'8.9.2016',
'7.9.2016',
'6.9.2016',
'5.9.2016']
Run Code Online (Sandbox Code Playgroud)
由于我需要处理的"人工日期"(例如"29.2.2015"),我需要零天数和月数,我不能使用标准日历方法
以下似乎正在起作用:
>>> parsed_dates = []
>>> for l in [d.split('.') for d in dates]:
>>> parsed_dates.append('.'.join([i.zfill(2) for i in l]))
>>> parsed_dates
['14.09.2016',
'13.09.2016',
'12.09.2016',
'11.09.2016',
'10.09.2016',
'09.09.2016',
'08.09.2016',
'07.09.2016',
'06.09.2016',
'05.09.2016']
Run Code Online (Sandbox Code Playgroud)
使用单个列表理解可以实现相同的结果吗?还是其他更优雅的方式?我试过以下,但找不到连接单个列表项以再次形成日期字符串的方法...
>>> [i.zfill(2) for l in [d.split('.') for d in dates] for i in l]
['14',
'09',
'2016',
'13',
'09',
'2016',
'12',
'09',
.
.
.
Run Code Online (Sandbox Code Playgroud)