小编kek*_*ert的帖子

用系列更新数据帧

有一个数据帧,我想更新列的子集,其长度与正在更新的列数相同:

>>> 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)

你能帮我理解,为什么系列更新失败了?我必须进行一些特殊的重塑吗?

python dataframe pandas

6
推荐指数
1
解决办法
1120
查看次数

使用 pandas 增量数据加载

我正在尝试使用 pandas 实现增量数据导入。

我有两个数据帧:df_old(原始数据,之前加载)和df_new(新数据,与df_old合并)。

df_old/df_new 中的数据在多个列上是唯一的(为简单起见,我们只说 2:key1 和 key2)。其他列是要合并的数据,可以说,它们也只是其中的 2 列:val1 和 val2。

除此之外,还有一列需要注意:change_id - 它会随着每个新条目覆盖旧条目而增加

导入的逻辑非常简单:

  1. 如果 df_new 中有新的密钥对,则应将其(以及相应的 val1/val2 值)添加到 df_old
  2. 如果 df_new 中存在 df_old 中存在的密钥对,则:

    2a) 如果 df_old 和 df_new 中的对应值相同,则应保留旧值

    2b) 如果 df_old 和 df_new 中的对应值不同,则 df_new 中的值应替换 df_old 中的旧值

  3. 无需关心 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)

python merge pandas

5
推荐指数
1
解决办法
6107
查看次数

python字符串解析列表

我有一个表示日期的字符串列表:

>>> 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)

python list-comprehension

2
推荐指数
1
解决办法
47
查看次数

标签 统计

python ×3

pandas ×2

dataframe ×1

list-comprehension ×1

merge ×1