使用python pandas 0.19。
我想创建一个新的数据帧(df2)作为现有数据帧(df1)的子集。 df1看起来像这样:
In [1]: df1.head()
Out [1]:
col1_name col2_name col3_name
0 23 42 55
1 27 55 57
2 52 20 52
3 99 18 53
4 65 32 51
逻辑是:
df2 = []
for i in range(0,N):
loc = some complicated logic
df1_sub = df1.ix[loc,]
df2.append(df1_sub)
df2 = pd.DataFrame.from_records(df2)
结果df2确实是一个数据帧,但内容全部由df1的列名组成。它看起来像这样:
In [2]: df2.head()
Out [2]:
col1_name col2_name col3_name
0 col1_name col2_name col3_name
1 col1_name col2_name col3_name
2 col1_name col2_name col3_name
3 col1_name col2_name col3_name
4 col1_name col2_name col3_name
我知道这可能与从列表到数据框的转换有关,但我不确定我到底错过了什么。或者有更好的方法吗?
答案 0 :(得分:1)
根据Ted Petrou,解决方案很简单:
pd.concat(df2)
我对df2的数据类型感到困惑。
鉴于for循环中的逻辑,使用某个索引直接选择df1是不可能的。
答案 1 :(得分:0)
如何对数据帧进行切片?
import pandas as pd
DF1 = pd.DataFrame()
DF1['x'] = ['a','b','c','a','c','b']
DF1['y'] = [1,3,2,-1,-2,-3]
DF2 = DF1[[(x == 'a' and y > 0) for x,y in zip(DF1['x'], DF1['y'])]]
这应该比附加更有效。 DF1 [复杂条件]采用任何布尔争论
答案 2 :(得分:0)
你可以利用pandas'(实际上是numpy的)蒙面数组。
import pandas as pd
df1 = pd.DataFrame({'a': [1, 2, 3, 4, 5], 'b': ['a', 'b', 'c', 'd', 'e'],
'c': [10, 11, 12, 13, 14]})
# a b c
# 0 1 a 10
# 1 2 b 11
# 2 3 c 12
# 3 4 d 13
# 4 5 e 14
我们假设df2
应该是df1
的一个子集:它应该有b
列和c
列,而只有列a
的列{}均值:
df2 = df1[df1['a'] % 2 == 0][['b', 'c']]
# b c
# 1 b 11
# 3 d 13