重新分配Pandas DataFrame列值

时间:2019-05-29 17:10:16

标签: python pandas

我的csv的日期时间格式不正确。我已经研究出如何将这些值转换为所需的格式,但是现在我需要将列中的所有值重新分配给新的转换后的值。

例如,我希望可以在以下FOR循环中放入一些内容,这些值会将值重新插入数据帧中的正确位置:

for i in df[df.columns[1]]:
    t = pd.Timestamp(i)
    short_date = t.date().strftime('%m/%d/%Y').lstrip('0')   
    # Insert back into dataframe?

一如既往,非常感谢您的帮助!

该列的一部分: 有问题的数据框的一部分:

Created Date    
2019-02-27 22:55:16    
2019-01-29 22:57:12    
2018-11-29 00:13:31    
2019-01-30 21:35:15
2018-12-20 21:14:45    
2018-11-01 16:20:15    
2019-04-11 16:38:07    
2019-01-24 00:23:17    
2018-12-21 19:30:10    
2018-12-19 22:33:04    
2018-11-07 19:54:19    
2019-05-10 21:15:00

3 个答案:

答案 0 :(得分:1)

用最简单但最具启发性的术语:

df = pd.DataFrame({'x': [1, 2, 3], 'y': [4, 5, 6]})
df
#    x  y
# 0  1  4
# 1  2  5
# 2  3  6

df[:] = df[:].astype(float)
df
#      x    y
# 0  1.0  4.0
# 1  2.0  5.0
# 2  3.0  6.0

pandas为您完成工作。

或者,仅一列:

df.x = df.x.astype(float)
df
#      x  y
# 0  1.0  4
# 1  2.0  5
# 2  3.0  6

您当然可以将astype(float)替换为.date().strftime('%m/%d/%Y').lstrip('0')

答案 1 :(得分:1)

要重新分配列,无需循环。这样的事情应该起作用:

import pandas as pd
events = pd.read_csv("df_events.csv")
events.set_index('index',inplace=True)
visits = pd.read_csv("df_visits.csv")
visits.set_index('index',inplace=True)
correct_delta = len(set(visits.visit_id) - set(events.visit_id))
print(correct_delta) #1670
filter_real_v = events.visit_id.isin(set(visits.visit_id))
bad_delta = filter_real_v.value_counts()
print(bad_delta[True]) #702680

df["column"] = new_column 是长度匹配的new_column,或者是可以广播 1 到该长度的东西。您可以在docs中找到更多详细信息。

也就是说,如果Series已经可以解析您的数据,则无需“格式化”。格式与时间戳实例无关。转换为类似pd.Timestamp之类的字符串时,可以选择一种特殊的格式。

另一方面,如果您想更改时间戳的精度,则可以执行以下操作:

df["timestamp"].dt.strftime("%m/%d/%Y")

在这里,所有时间信息将四舍五入为几天。 df["timestamp"] = df["timestamp"].astype("datetime64[D]") [之间的字母是分辨率。同样,所有这些以及更多内容都将在docs中进行讨论。


1 广播是]中的一个概念,您可以在不同但形状兼容的阵列之间进行操作。同样,所有内容都包含在docs中。

答案 2 :(得分:0)

谢谢大家的帮助。所有答案都是有帮助的,但是我最终使用的答案如下:

import pandas as pd 

df[df.columns[0]] = pd.to_datetime(df[df.columns[0]]).dt.strftime('%m/%d/%Y')