这种行为对我来说似乎很奇怪:id当转换df另一列是timedelta时,列(字符串)转换为时间戳.
import pandas as pd
df = pd.DataFrame({'id': ['00115', '01222', '32333'],
'val': [12, 14, 170]})
df['val'] = pd.to_timedelta(df.val, unit='M')
print(df.T)
# 0 1 2
#id 0 days 00:00:00.000000 0 days 00:00:00.000001 0 days 00:00:00.000032
#val 365 days 05:49:12 426 days 02:47:24 5174 days 06:27:00
type(df.T[0][0])
#pandas._libs.tslib.Timedelta
Run Code Online (Sandbox Code Playgroud)
没有timedelta它按照我的预期工作,并且id列仍然是一个字符串,即使另一列是一个整数,所有字符串都可以安全地转换为整数.
df2 = pd.DataFrame({'id': ['00115', '01222', '32333'],
'val': [1, 1231, 1413]})
type(df2.T[0][0])
#str
Run Code Online (Sandbox Code Playgroud)
为什么id在第一个实例中更改get 的类型,而不是第二个实例?
我有以下数据框:
a b c d e f g h i j
1 2 3 4 5 6 7 8 0.1 0.11
11 12 13 14 15 16 17 18 0.2 0.12
21 22 23 24 25 26 27 28 0.3 0.13
31 32 33 34 35 36 37 38 0.4 0.14
Run Code Online (Sandbox Code Playgroud)
我想读取EACH ROW,并针对a到h列(在该行)中的每个值,减去i列中的值并除以j列中的值,然后用该结果值替换该原始值,并更新整个数据帧(从a到h)。
在这种情况下我应该如何进行?
我试图解析一系列文本,使用一系列数字,如下面的代码,但我得到的只是一系列 NaN。
import numpy as np
import pandas as pd
numData = np.array([4,6,4,3,6])
txtData = np.array(['bluebox','yellowbox','greybox','redbox','orangebox'])
n = pd.Series(numData)
t = pd.Series(txtData)
x = t.str[:n]
print (x)
Run Code Online (Sandbox Code Playgroud)
输出是
0 NaN
1 NaN
2 NaN
3 NaN
4 NaN
Run Code Online (Sandbox Code Playgroud)
我希望输出是
0 blue
1 yellow
2 grey
3 red
4 orange
Run Code Online (Sandbox Code Playgroud)
是否有捷径可寻。
举个例子,我有以下数据帧:
Date Balance
2013-04-01 03:50:00 A
2013-04-01 04:00:00 A
2013-04-01 04:15:00 B
2013-04-01 04:15:00 B
2013-04-01 04:25:00 A
2013-04-01 04:25:00 A
2013-04-01 04:35:00 B
2013-04-01 04:40:00 B
2013-04-02 04:55:00 B
2013-04-02 04:56:00 A
2013-04-02 04:57:00 A
2013-04-03 10:30:00 A
2013-04-03 16:35:00 A
2013-04-03 20:40:00 A
Run Code Online (Sandbox Code Playgroud)
我的目标是添加一个"计数器"列,基本上显示A和B的数量的平衡.因此,每次出现A时,计数器列都会增加一个值.每次出现B时,计数器列都会减少一个值.如果两个连续行中同时出现两个A(相同的日期),则两个行的余额应增加2(同样的推理适用于连续的B或同时适用于A和B).因此,数据框最终会如下所示:
Date Balance Counter
2013-04-01 03:50:00 A 1
2013-04-01 04:00:00 A 2
2013-04-01 04:15:00 B 0
2013-04-01 04:15:00 B 0
2013-04-01 04:25:00 A 2
2013-04-01 04:25:00 A 2
2013-04-01 04:35:00 B 1
2013-04-01 04:40:00 B …Run Code Online (Sandbox Code Playgroud) 因为我现在正在写我的硕士论文,所以我必须第一次使用 Python。为了用时间戳索引我的数据,我尝试了以下方法,但实际上并不奏效。好吧,也许确实如此,但是通过timestemp访问数据真是太愚蠢了。也许有人可以帮助我做下一步,以便我使用时间戳访问数据,以便我可以将我的年度数据分成几个月。
import pandas as pd
import numpy as np
import matplotlib.pylab as plt
from matplotlib import pyplot
import datetime as dt
from matplotlib.pylab import rcParams
import datetime
rcParams['figure.figsize'] = 15, 6
data = pd.read_csv('PhelixPowerSpotHistory_2015.csv')
data['Delivery Date']=pd.to_datetime(data['Delivery Date'])
#data['Time']= pd.to_datetime(data.DeliveryDate)
#print (data.head())
print(data.head(10))
from datetime import datetime
ts = data['PriceEUR/MWh']
print(ts.head(10))
import matplotlib.pyplot as plt
plt.plot(ts)
plt.ylabel('€/MWh')
plt.xlabel('Delivery Date')
plt.xticks(np.linspace(0,8721,12))
plt.show()
Run Code Online (Sandbox Code Playgroud)
我的数据头部如下所示:
0 2015-01-01 00:00:00 25.02
1 2015-01-01 01:00:00 18.29
2 2015-01-01 02:00:00 16.04
3 2015-01-01 03:00:00 14.60
4 2015-01-01 …Run Code Online (Sandbox Code Playgroud) 我正在尝试基于公共列合并多个DataFrame.这将在循环中完成,原始DataFrame可能没有所有列,因此需要外部合并.但是,当我在几个不同的DataFrames列上执行此操作时,使用后缀_x和_y复制.我正在寻找一个填充数据的DataFrame,并且只有在以前不存在的情况下才添加列.
df1=pd.DataFrame({'Company Name':['A','B','C','D'],'Data1':[1,34,23,66],'Data2':[13,54,5354,443]})
Company Name Data1 Data2
0 A 1 13
1 B 34 54
2 C 23 5354
3 D 66 443
Run Code Online (Sandbox Code Playgroud)
第二个DataFrame,包含一些公司的附加信息:
pd.DataFrame({'Company Name':['A','B'],'Address': ['str1', 'str2'], 'Phone': ['str1a', 'str2a']})
Company Name Address Phone
0 A str1 str1a
1 B str2 str2a
Run Code Online (Sandbox Code Playgroud)
如果我想组合这两个,它将使用on = Column成功合并为一个:
df1=pd.merge(df1,df2, on='Company Name', how='outer')
Company Name Data1 Data2 Address Phone
0 A 1 13 str1 str1a
1 B 34 54 str2 str2a
2 C 23 5354 NaN NaN
3 D 66 443 NaN NaN …Run Code Online (Sandbox Code Playgroud) 我附上了截图以帮助解释.我有一个从克利夫兰心脏数据集中提取的数据框,该数据集占用76列并将它们放入7列,并将其他列包装到下一行.我试图弄清楚如何将该数据帧变为可读格式,如右侧的数据框所示.
变量xyz将始终相同,但我列出的其他字母变量将不同.我以为我可以使用data.loc [:,:'xyz']开始,但我不知道从哪里开始:
data = pd.read_csv("../resources/cleveland.data")
data.loc[:, :'xyz']
Run Code Online (Sandbox Code Playgroud)
然后我必须从那里开始为这些变量分配列名.令人惊讶的是,一旦我解决了这个问题,火车,测试,验证部分将更加容易.在此先感谢您的帮助.(我是菜鸟)
我有一个“潜在”的大型DataFrame,
A B_1 B_2 B_3 C_1 C_2 C_3
0 231 text2 text3 NaN date4 date1 NaN
1 443 NaN NaN text1 date2 NaN NaN
2 456 text1 text1 text2 NaN date3 date1
Run Code Online (Sandbox Code Playgroud)
为了最小化某些NaNs,我想将所有数据向左移动,从而能够忽略所有NaN列。但是,此移位必须保留在适当的组内,这意味着,只要单元格不在B_1或B_2列中,只要它不移位到C_1等,都没有关系。
我最后要说的是
A B_1 B_2 B_3 C_1 C_2
0 231 text2 text3 NaN date4 date1
1 443 text1 NaN NaN date2 NaN
2 456 text1 text1 text2 date3 date1
Run Code Online (Sandbox Code Playgroud) 仅当另一个列值为True时,才如何比较两个(或更多列)值。理想情况下,输出将只是True(如果一切都正确匹配),否则为False。
这样的事情:df['value1'].equals(df['value2'])但仅当df ['isValid']为true时。
抱歉,如果这是一个愚蠢的问题,我是熊猫的初学者...
考虑以下数据框:
范例1:
isValid value1 value2
True 50 50
True 19 19
False 48 40
Run Code Online (Sandbox Code Playgroud)
输出应为:True(记录一和两次匹配),并且“ isValid”列为True(这意味着我们必须比较值)
范例2:
isValid value1 value2
False 50 50
False 19 19
False 48 40
Run Code Online (Sandbox Code Playgroud)
输出应为True(无需进行比较,那么就没错了)
范例3:
isValid value1 value2
True 50 50
False 19 19
True 48 40
Run Code Online (Sandbox Code Playgroud)
输出应为False(因为记录3的value1和value2不同)
如何删除重复行,以便仅删除最后一个重复条目。pandas drop_duplicates 函数只会保留第一个条目或最后一个条目,但我需要除最后一个条目之外的所有条目。
例如:
X = pd.DataFrame({"col1": list('acbcaa')})
Run Code Online (Sandbox Code Playgroud)
所需输出
X = pd.DataFrame({"col1": list('acba')})
Run Code Online (Sandbox Code Playgroud)