1. DataFrame添加新的行

  1. # 读取names数据集
  2. In[2]: names = pd.read_csv('data/names.csv')
  3. names
  4. Out[2]:

1. DataFrame添加新的行 - 图1

  1. # 用loc直接赋值新的行
  2. In[3]: new_data_list = ['Aria', 1]
  3. names.loc[4] = new_data_list
  4. names
  5. Out[3]:

1. DataFrame添加新的行 - 图2

  1. # 用loc的标签直接赋值新的行
  2. In[4]: names.loc['five'] = ['Zach', 3]
  3. names
  4. Out[4]:

1. DataFrame添加新的行 - 图3

  1. # 也可以用字典赋值新行
  2. In[5]: names.loc[len(names)] = {'Name':'Zayd', 'Age':2}
  3. names
  4. Out[5]:

1. DataFrame添加新的行 - 图4

  1. In[6]: names
  2. Out[6]:

1. DataFrame添加新的行 - 图5

  1. # 字典可以打乱列名的顺序
  2. In[7]: names.loc[len(names)] = pd.Series({'Age':32, 'Name':'Dean'})
  3. names
  4. Out[7]:

1. DataFrame添加新的行 - 图6

  1. # 直接append一个字典
  2. In[8]: names = pd.read_csv('data/names.csv')
  3. names.append({'Name':'Aria', 'Age':1})
  4. ---------------------------------------------------------------------------
  5. TypeError Traceback (most recent call last)
  6. <ipython-input-8-562aecc73587> in <module>()
  7. 1 # Use append with fresh copy of names
  8. 2 names = pd.read_csv('data/names.csv')
  9. ----> 3 names.append({'Name':'Aria', 'Age':1})
  10. /Users/Ted/anaconda/lib/python3.6/site-packages/pandas/core/frame.py in append(self, other, ignore_index, verify_integrity)
  11. 4515 other = Series(other)
  12. 4516 if other.name is None and not ignore_index:
  13. -> 4517 raise TypeError('Can only append a Series if ignore_index=True'
  14. 4518 ' or if the Series has a name')
  15. 4519
  16. TypeError: Can only append a Series if ignore_index=True or if the Series has a name
  1. # 按照错误提示,加上ignore_index=True
  2. In[9]: names.append({'Name':'Aria', 'Age':1}, ignore_index=True)
  3. Out[9]:

1. DataFrame添加新的行 - 图7

  1. # 设定行索引
  2. In[10]: names.index = ['Canada', 'Canada', 'USA', 'USA']
  3. names
  4. Out[10]:

1. DataFrame添加新的行 - 图8

  1. # 添加一行
  2. In[11]: names.append({'Name':'Aria', 'Age':1}, ignore_index=True)
  3. Out[11]:

1. DataFrame添加新的行 - 图9

  1. # 创建一个Series对象
  2. In[12]: s = pd.Series({'Name': 'Zach', 'Age': 3}, name=len(names))
  3. s
  4. Out[12]: Age 3
  5. Name Zach
  6. Name: 4, dtype: object
  1. # append方法可以将DataFrame和Series相连
  2. In[13]: names.append(s)
  3. Out[13]:

1. DataFrame添加新的行 - 图10

  1. # append方法可以同时连接多行,只要将对象放到列表中
  2. In[14]: s1 = pd.Series({'Name': 'Zach', 'Age': 3}, name=len(names))
  3. s2 = pd.Series({'Name': 'Zayd', 'Age': 2}, name='USA')
  4. names.append([s1, s2])
  5. Out[14]:

1. DataFrame添加新的行 - 图11

  1. # 读取baseball16数据集
  2. In[15]: bball_16 = pd.read_csv('data/baseball16.csv')
  3. bball_16.head()
  4. Out[15]:

1. DataFrame添加新的行 - 图12

  1. # 选取一行,并将其转换为字典
  2. In[16]: data_dict = bball_16.iloc[0].to_dict()
  3. print(data_dict)
  4. {'playerID': 'altuvjo01', 'yearID': 2016, 'stint': 1, 'teamID': 'HOU', 'lgID': 'AL', 'G': 161, 'AB': 640, 'R': 108, 'H': 216, '2B': 42, '3B': 5, 'HR': 24, 'RBI': 96.0, 'SB': 30.0, 'CS': 10.0, 'BB': 60, 'SO': 70.0, 'IBB': 11.0, 'HBP': 7.0, 'SH': 3.0, 'SF': 7.0, 'GIDP': 15.0}
  1. # 对这个字典做格式处理,如果是字符串则为空,否则为缺失值
  2. In[17]: new_data_dict = {k: '' if isinstance(v, str) else np.nan for k, v in data_dict.items()}
  3. print(new_data_dict)
  4. {'playerID': '', 'yearID': nan, 'stint': nan, 'teamID': '', 'lgID': '', 'G': nan, 'AB': nan, 'R': nan, 'H': nan, '2B': nan, '3B': nan, 'HR': nan, 'RBI': nan, 'SB': nan, 'CS': nan, 'BB': nan, 'SO': nan, 'IBB': nan, 'HBP': nan, 'SH': nan, 'SF': nan, 'GIDP': nan}

更多

  1. # 将一行数据添加到DataFrame是非常消耗资源的,不能通过循环的方法来做。下面是创建一千行的新数据,用作Series的列表:
  2. In[18]: random_data = []
  3. for i in range(1000):
  4. d = dict()
  5. for k, v in data_dict.items():
  6. if isinstance(v, str):
  7. d[k] = np.random.choice(list('abcde'))
  8. else:
  9. d[k] = np.random.randint(10)
  10. random_data.append(pd.Series(d, name=i + len(bball_16)))
  11. random_data[0].head()
  12. Out[18]: 2B 2
  13. 3B 6
  14. AB 8
  15. BB 2
  16. CS 0
  17. Name: 16, dtype: object
  1. # 给上面的append操作计时,1000行的数据用了5秒钟
  2. In[19]: %%timeit
  3. bball_16_copy = bball_16.copy()
  4. for row in random_data:
  5. bball_16_copy = bball_16_copy.append(row)
  6. 5.36 s ± 298 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
  1. # 如果是通过列表的方式append,可以大大节省时间
  2. In[20]: %%timeit
  3. bball_16_copy = bball_16.copy()
  4. bball_16_copy = bball_16_copy.append(random_data)
  5. 86.2 ms ± 3.71 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)