Select closest time to a certain hour in python pandas - python
I'm looking to see if there is a way to select the closet time to a certain hour. I have the following. The file contains 10 years worth of data and I've narrowed it down to some time series that I'd want to keep.
import pandas as pd
from pandas import DataFrame
import matplotlib.pyplot as plt
from matplotlib.pyplot import *
import datetime
import numpy as np
dateparse = lambda x: pd.datetime.strptime(x, "%d:%m:%Y %H:%M:%S")
aeronet = pd.read_csv('somefile', skiprows = 4, na_values = ['N/A'], parse_dates={'times':[0,1]}, date_parser=dateparse)
aeronet = aeronet.set_index('times')
del aeronet['Julian_Day']
aeronet.between_time('06:00:00', '07:00:00'), aeronet.between_time('12:00:00', '13:00:00')
I've selected a snippet of such. Is there such a way to select just the closest to time to 06 or 12 and it contents and discard/ignore the rest from the pandas series, and do this for the entirety of the file?
times AOT_1640 AOT_1020 AOT_870 AOT_675 AOT_667 AOT_555 ...
2000-08-07 06:49:10 NaN 0.380411 0.406041 0.445789 NaN NaN
2000-08-07 06:57:36 NaN 0.353378 0.377769 0.420168 NaN NaN
2000-08-08 06:31:00 NaN 0.322402 0.338164 0.364679 NaN NaN
2000-08-08 06:33:28 NaN 0.337819 0.353995 0.381201 NaN NaN
2000-08-08 06:36:26 NaN 0.347656 0.361839 0.390342 NaN NaN
2000-08-08 06:51:50 NaN 0.306449 0.325672 0.351885 NaN NaN
2000-08-08 06:54:23 NaN 0.336512 0.355386 0.380230 NaN NaN
2000-08-08 06:57:20 NaN 0.330028 0.345679 0.373780 NaN NaN
2000-08-09 06:34:56 NaN 0.290533 0.306911 0.336597 NaN NaN
2000-08-09 06:41:53 NaN 0.294413 0.311553 0.343473 NaN NaN
2000-08-09 06:49:45 NaN 0.311042 0.332054 0.360999 NaN NaN
2000-08-09 06:52:15 NaN 0.319396 0.339932 0.369617 NaN NaN
2000-08-09 06:55:20 NaN 0.327440 0.349084 0.378345 NaN NaN
2000-08-09 06:58:23 NaN 0.323247 0.345273 0.373879 NaN NaN
2000-08-12 06:30:01 NaN 0.465173 0.471528 0.483079 NaN NaN
2000-08-12 06:33:05 NaN 0.460013 0.465674 0.479500 NaN NaN
2000-08-12 06:35:59 NaN 0.433161 0.438488 0.453779 NaN NaN
2000-08-12 06:42:12 NaN 0.406479 0.415580 0.432160 NaN NaN
2000-08-12 06:50:06 NaN 0.414227 0.424330 0.439448 NaN NaN
2000-08-12 06:57:21 NaN 0.396034 0.404258 0.423866 NaN NaN
2000-08-12 06:59:47 NaN 0.372097 0.380798 0.401600 NaN NaN
[6200 rows x 42 columns]
...
times AOT_1640 AOT_1020 AOT_870 AOT_675 AOT_667 AOT_555 ...
2000-01-01 12:23:54 NaN 0.513307 0.557325 0.653497 NaN NaN
2000-01-03 12:24:49 NaN 0.439142 0.494118 0.593997 NaN NaN
2000-01-03 12:39:49 NaN 0.429130 0.477874 0.577334 NaN NaN
2000-01-03 12:54:48 NaN 0.437720 0.489006 0.586224 NaN NaN
2000-01-04 12:10:30 NaN 0.325203 0.362335 0.426348 NaN NaN
2000-01-04 12:25:15 NaN 0.323978 0.356274 0.423620 NaN NaN
2000-01-04 12:40:15 NaN 0.325356 0.361138 0.427271 NaN NaN
2000-01-04 12:55:14 NaN 0.326595 0.363519 0.431527 NaN NaN
2000-01-06 12:11:08 NaN 0.282777 0.307676 0.369811 NaN NaN
2000-01-06 12:26:09 NaN 0.285853 0.314178 0.374832 NaN NaN
2000-01-06 12:41:08 NaN 0.258836 0.289263 0.346880 NaN NaN
2000-01-08 12:12:04 NaN 0.165473 0.185018 0.235770 NaN NaN
2000-01-08 12:42:01 NaN 0.143540 0.164647 0.216335 NaN NaN
2000-01-08 12:57:01 NaN 0.142760 0.164886 0.215461 NaN NaN
2000-01-10 12:12:52 NaN 0.192453 0.225909 0.310540 NaN NaN
2000-01-10 12:27:53 NaN 0.202532 0.238400 0.322692 NaN NaN
2000-01-10 12:42:52 NaN 0.199996 0.235561 0.320756 NaN NaN
2000-01-10 12:57:52 NaN 0.208046 0.245054 0.331214 NaN NaN
2000-01-11 12:13:19 NaN 0.588879 0.646470 0.750459 NaN NaN
2000-01-11 12:28:17 NaN 0.621813 0.680442 0.788457 NaN NaN
2000-01-11 12:43:17 NaN 0.626547 0.685880 0.790631 NaN NaN
2000-01-11 12:58:16 NaN 0.631142 0.689125 0.796060 NaN NaN
2000-01-12 12:28:42 NaN 0.535105 0.584593 0.688904 NaN NaN
2000-01-12 12:43:41 NaN 0.518697 0.571025 0.676406 NaN NaN
2000-01-12 12:58:40 NaN 0.528318 0.583229 0.687795 NaN NaN
2000-01-13 12:14:20 NaN 0.382645 0.419463 0.496089 NaN NaN
2000-01-13 12:29:05 NaN 0.376186 0.414921 0.491920 NaN NaN
2000-01-13 12:44:05 NaN 0.387845 0.424576 0.501968 NaN NaN
2000-01-13 12:59:04 NaN 0.386237 0.423254 0.503163 NaN NaN
2000-01-14 12:14:43 NaN 0.400024 0.425522 0.485719 NaN NaN
[6672 rows x 42 columns])
Such a way that the aeronet dataframe looks similar to this when I print it out? I'm hoping to either still do some calculation with it still or export it to excel.
times AOT_1640 AOT_1020 AOT_870 AOT_675 AOT_667 AOT_555 ...
2000-08-07 06:49:10 NaN 0.380411 0.406041 0.445789 NaN NaN
2000-08-08 06:31:00 NaN 0.322402 0.338164 0.364679 NaN NaN
2000-08-09 06:34:56 NaN 0.290533 0.306911 0.336597 NaN NaN
2000-08-12 06:30:01 NaN 0.465173 0.471528 0.483079 NaN NaN
....
2000-01-01 12:23:54 NaN 0.513307 0.557325 0.653497 NaN NaN
2000-01-03 12:24:49 NaN 0.439142 0.494118 0.593997 NaN NaN
2000-01-04 12:10:30 NaN 0.325203 0.362335 0.426348 NaN NaN
2000-01-06 12:11:08 NaN 0.282777 0.307676 0.369811 NaN NaN
2000-01-08 12:12:04 NaN 0.165473 0.185018 0.235770 NaN NaN
2000-01-10 12:12:52 NaN 0.192453 0.225909 0.310540 NaN NaN
2000-01-11 12:13:19 NaN 0.588879 0.646470 0.750459 NaN NaN
2000-01-12 12:28:42 NaN 0.535105 0.584593 0.688904 NaN NaN
2000-01-13 12:14:20 NaN 0.382645 0.419463 0.496089 NaN NaN
2000-01-14 12:14:43 NaN 0.400024 0.425522 0.485719 NaN NaN
Probably a more efficient way to do this, but this gets the job done I think.
First, add fields for date and time:
aeronet['date'] = aeronet.times.dt.date
aeronet['time'] = aeronet.times.dt.time
Now, aeronet.date.unique() gets you a list of the unique dates. You'll need it later.
dates = aeronet.date.unique()
Create a column that gives absolute distance from 6 am
from datetime import date, datetime, time
sixam = time(6,0,0,0)
def fromsix(time):
abs(datetime.combine(date.min, time) - datetime.combine(date.min, sixam))
aeronet['fromsix'] = aeronet.time.apply(fromsix)
datetime.combine is necessary because apparently you can't just subtract two times.
And now, finally,
pd.concat([aeronet[aeronet.date == date][aeronet.fromsix == aeronet[aeronet.date == date].fromsix.min()] for date in dates])
use a list comprehension to slice the dataframe into individual dates, find the element with minimal distance from sixam, and concatenate them together.
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.merge_asof.html
thats the way to go buddy. efficient, simple, fast.
Related
Count number of nans between two numbers in row
I have a Pandas DataFrame with consumption measurements over several days, so that a measurement on a given day represents the consumption over all the previous days without measurements. For each consumer (a row), I have something like Nan, 10, Nan, Nan, Nan, Nan, Nan, Nan, 21, Nan, ... meaning that the average consumption between the 10 and the 20 was 21/7=3, i.e., 21 divided by (six NaNs plus one). The measurements come at irregular intervals, so I need to divide each measurement by the number of NaNs between it and the previous measurement. I want my output from the example above to be Nan, 0.4347, Nan, Nan, Nan, Nan, Nan, Nan, 3, Nan, .... The first measurement should be divided by 23, but I can live without getting it right. How can I do this? Here is an example of my data: SP ID,2016-12-28,2016-12-29,2016-12-30,2016-12-31,2017-01-01,2017-01-03,2017-01-04,2017-01-05,2017-01-06,2017-01-09,2017-01-10,2017-01-11,2017-01-12,2017-01-13,2017-01-16,2017-01-17,2017-01-18,2017-01-19,2017-01-20,2017-01-21,2017-01-23,2017-01-24,2017-01-25,2017-01-26,2017-01-27,2017-01-29,2017-01-30,2017-01-31,2017-02-01,2017-02-02,2017-02-03,2017-02-06,2017-02-07,2017-02-08,2017-02-09,2017-02-10,2017-02-13,2017-02-14,2017-02-15,2017-02-16,2017-02-17,2017-02-18,2017-02-21,2017-02-22,2017-02-23,2017-02-24,2017-02-27,2017-02-28,2017-03-01,2017-03-02 100854,,,4.0,,,,,,,,,,,,,,,,,,,,,,,,,4.0,,,,,,,,,,,,,,,,,,,,3.0,, 120355,,,9.0,,,,,,,,,,,,,,,,,,,,,,,,9.0,,,,,,,,,,,,,,,,,,,,,,,9.0 200357,,,,,,,,,,,18.0,,,,,,,,,,,,,,,,,,,,,,,,22.0,,,,,,,,,,,,,,, The expected output is below (dividing the first occurrence by 23). We have for example 4.0/25=0.16. SP ID,2016-12-28,2016-12-29,2016-12-30,2016-12-31,2017-01-01,2017-01-03,2017-01-04,2017-01-05,2017-01-06,2017-01-09,2017-01-10,2017-01-11,2017-01-12,2017-01-13,2017-01-16,2017-01-17,2017-01-18,2017-01-19,2017-01-20,2017-01-21,2017-01-23,2017-01-24,2017-01-25,2017-01-26,2017-01-27,2017-01-29,2017-01-30,2017-01-31,2017-02-01,2017-02-02,2017-02-03,2017-02-06,2017-02-07,2017-02-08,2017-02-09,2017-02-10,2017-02-13,2017-02-14,2017-02-15,2017-02-16,2017-02-17,2017-02-18,2017-02-21,2017-02-22,2017-02-23,2017-02-24,2017-02-27,2017-02-28,2017-03-01,2017-03-02 100854,,,0.17,,,,,,,,,,,,,,,,,,,,,,,,,0.16,,,,,,,,,,,,,,,,,,,,0.15,, 120355,,,0.391,,,,,,,,,,,,,,,,,,,,,,,,0.375,,,,,,,,,,,,,,,,,,,,,,,0.391 200357,,,,,,,,,,,0.78,,,,,,,,,,,,,,,,,,,,,,,,0.917,,,,,,,,,,,,,,
Apply a custom function on each row using apply with axis=1. Inside the function, you can find the non-null indices and the difference between each consecutive pair. For the first diff, we can hard-code it to 23 as desired. def row_norm(row): indices = row.reset_index(drop=True) indices = indices[indices.notna()].index.values diffs = [e-s for s, e in zip(indices, indices[1:])] diffs[0] = 23 row.iloc[indices[1:]] = row.iloc[indices[1:]].astype(float) / diffs return row df.apply(row_norm, axis=1) Result: SP ID 2016-12-28 2016-12-29 2016-12-30 2016-12-31 2017-01-01 2017-01-03 2017-01-04 2017-01-05 2017-01-06 2017-01-09 2017-01-10 2017-01-11 2017-01-12 2017-01-13 2017-01-16 2017-01-17 2017-01-18 2017-01-19 2017-01-20 2017-01-21 2017-01-23 2017-01-24 2017-01-25 2017-01-26 2017-01-27 2017-01-29 2017-01-30 2017-01-31 2017-02-01 2017-02-02 2017-02-03 2017-02-06 2017-02-07 2017-02-08 2017-02-09 2017-02-10 2017-02-13 2017-02-14 2017-02-15 2017-02-16 2017-02-17 2017-02-18 2017-02-21 2017-02-22 2017-02-23 2017-02-24 2017-02-27 2017-02-28 2017-03-01 2017-03-02 0 100854.0 NaN NaN 0.173913 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.16 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.15 NaN NaN 1 120355.0 NaN NaN 0.391304 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.375 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.391304 2 200357.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.782609 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.916667 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
np.dot returns nan for Dataframe(float64) and np.ndarray(fload64)
I have a squared dataframe containing over 505 rows and columns (a 505x505 matrix) which I need to dot multiply to an ndarray from numpy (505 items). the problem is that the result is an ndarray with 505 items, full of nan. I tried replicating it on a separate notebook, but I wasn't able to. in print('df ', df) print('info ', df.info()) result = np.dot(df, np.random.rand(505)) print('result.shape: ', result.shape) print('result ', result) out df A AAL AAP AAPL ABBV ABC ABMD \ A 0.093188 0.072021 0.048887 0.067503 0.047795 0.052311 0.051706 AAL 0.072021 0.547093 0.099290 0.069475 0.045120 0.066275 0.065950 AAP 0.048887 0.099290 0.143932 0.055590 0.043934 0.059230 0.041979 AAPL 0.067503 0.069475 0.055590 0.140050 0.051688 0.054113 0.060444 ABBV 0.047795 0.045120 0.043934 0.051688 0.096598 0.047673 0.032663 ... ... ... ... ... ... ... ... YUM 0.042185 0.095983 0.058538 0.052228 0.036547 0.046676 0.031293 ZBH 0.054474 0.127670 0.057043 0.054673 0.046718 0.054718 0.053090 ZBRA 0.079731 0.100945 0.064364 0.091272 0.054140 0.062255 0.066586 ZION 0.061233 0.176829 0.075915 0.048804 0.044935 0.066857 0.044151 ZTS 0.060966 0.052413 0.054156 0.069211 0.047445 0.054443 0.041018 XRAY XYL YUM ZBH ZBRA ZION ZTS A 0.053152 0.064197 0.042185 0.054474 0.079731 0.061233 0.060966 AAL 0.110541 0.125551 0.095983 0.127670 0.100945 0.176829 0.052413 AAP 0.064716 0.071780 0.058538 0.057043 0.064364 0.075915 0.054156 AAPL 0.047973 0.067265 0.052228 0.054673 0.091272 0.048804 0.069211 ABBV 0.049469 0.043552 0.036547 0.046718 0.054140 0.044935 0.047445 ... ... ... ... ... ... ... ... YUM 0.060310 0.059523 0.098728 0.069827 0.051222 0.057302 0.057192 ZBH 0.084555 0.068429 0.069827 0.136291 0.070115 0.089688 0.058264 ZBRA 0.068271 0.085070 0.051222 0.070115 0.185910 0.087744 0.069007 ZION 0.099294 0.098861 0.057302 0.089688 0.087744 0.204927 0.040132 ZTS 0.052646 0.057712 0.057192 0.058264 0.069007 0.040132 0.095019 [505 rows x 505 columns] <class 'pandas.core.frame.DataFrame'> Index: 505 entries, A to ZTS Columns: 505 entries, A to ZTS dtypes: float64(505) memory usage: 2.0+ MB info None result.shape: (505,) result [nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan]
In this situation you should use DataFrame.dot import pandas as pd; import numpy as np df = pd.DataFrame(np.random.randn(5,5), columns=['one', 'two', 'three', 'four', 'five']) other = pd.DataFrame(np.random.randn(5,5), columns=['one', 'two', 'three', 'four', 'five']).transpose() Notice that the indices of the second DataFrame must match the rows of the first, then you can multiply them df.dot(other) # or other.dot(df) Remember that the matrix multiplication is not commutative. If you do df.dot(other) it will return a dataframe with the indices of df and the columns of other, if you call it with a numpy array it will return a dataframe with columns counting [0,1,2,...]
How to fix [nan] output from csv file?
I’m trying to work with a very large csv file (15,500) that contains a Date, Time (HH:MM), Name, High, Low as the fields. Ideally this project will give me time bins for the data to show me what time the highest and lowest priced item tends to sell. The first step I’ve tried is to simply get the data into python and I’m encountering issues already. Before I can even begin to think about how to accomplish the end goal I’m stuck. I'm obviously so new at this, so please be kind...` import numpy as np my_data = np.genfromtxt('http://localhost:8888/edit/Downloads/sales.csv', delimiter= " , ", invalid_raise = False) print (my_data) output [nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan] At this step I'd just like to see that my data has been imported correctly. The next step I believe will be to find the max and min for each date, then figure out which time those happened. Would that just be a for loop for the date, then an embedded for loop to find max and min? I'd like a simple histograph of the time bins on the bottom to show if there is a time when the most expensive item sells and when the least expensive item sells (the data is already in 5min buckets).
There are spaces around the ",", try removing these. Additionally, try to add dtype=None, encoding='utf-8'. So try: my_data = np.genfromtxt('Downloads/sales.csv', delimiter=",", dtype=None, encoding='utf-8') Additionally, if the CSV has headers, you could try adding names=True. If you do that, you can access them by doing my_data['header_name']. (And (500,15) does not sound that large, numpy can deal with much larger arrays.) And you should not use the Jupyter notebook url for loading that file. Just change the path to the proper filename.
Accesing elements in a dictionary in python
I am very new in python. I am trying to acces data in a xml file. my xml file and code is as below: import xmltodict #from xml.dom import minidom #doc = minidom.parse("staff.xml") data = """<Azimuth> <COL_STEP unit="m">5000</COL_STEP> <ROW_STEP unit="m">5000</ROW_STEP> <Values_List> <VALUES>59.9563 53.0871 44.4595 33.8743 21.5482 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES> <VALUES>58.4469 51.1869 42.099 31.0545 18.418 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES> <VALUES>56.8537 49.1809 39.623 28.139 15.2538 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES> <VALUES>55.1672 47.0649 37.0345 25.1409 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES> <VALUES>53.3851 44.8373 34.3343 22.0718 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES> <VALUES>51.5013 42.4952 31.5308 18.9484 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES> <VALUES>49.5128 40.0378 28.6308 15.7878 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES> <VALUES>47.4157 37.4668 25.6447 12.609 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES> <VALUES>45.2056 34.7844 22.5855 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES> <VALUES>42.8812 31.9968 19.4688 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES> <VALUES>40.442 29.1107 16.3121 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES> <VALUES>37.8884 26.1373 13.134 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES> <VALUES>35.2231 23.0883 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES> <VALUES>32.4513 19.9792 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES> <VALUES>29.5804 16.8268 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES> <VALUES>26.6194 13.6499 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES> <VALUES>23.5805 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES> <VALUES>20.479 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES> <VALUES>17.3318 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES> <VALUES>14.1568 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES> <VALUES>NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES> <VALUES>NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES> <VALUES>NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES> </Values_List> </Azimuth>""" data = xmltodict.parse(data, encoding='utf-8') p=data['Azimuth']['Values_List'] print(type(p)) import dict_digger print(dict_digger.dig(data, 'Values_List')) What I am trying to acces the 23*23 array inside the 'Values List' but I am struggling. Is there any way I can acces those values? Thanks
Try p=data['Azimuth']['Values_List']['VALUES'] You'll probably want the matrix as a numpy array: import numpy as np parsedMatrix = np.array([line.split(' ') for line in p]).astype(float)
dropna() for multiple columns
Here is a sample of my dataframe: benzene toluene styrene xylenes + ethylbenzene 1,3,5-trimethylbenzene propylbenzene chlorobenzene 4-ethyltoluene isopropyl benzene 1,3-butadiene 0 1.1040 NaN NaN NaN NaN NaN NaN NaN NaN 0.1914 1 1.1312 NaN NaN NaN NaN NaN NaN NaN NaN 0.2353 2 1.6092 NaN NaN NaN NaN NaN NaN NaN NaN 0.7289 3 1.2578 NaN NaN NaN NaN NaN NaN NaN NaN 0.3269 4 1.8245 NaN NaN NaN NaN NaN NaN NaN NaN 0.2859 5 1.1438 NaN NaN NaN NaN NaN NaN NaN NaN 0.1229 6 1.1492 NaN NaN NaN NaN NaN NaN NaN NaN 0.4135 7 0.8638 NaN NaN NaN NaN NaN NaN NaN NaN 0.6211 8 1.3209 NaN NaN NaN NaN NaN NaN NaN NaN 0.6243 9 1.8316 NaN NaN NaN NaN NaN NaN NaN NaN 0.6711 10 1.0491 NaN NaN NaN NaN NaN NaN NaN NaN 0.3379 11 1.5014 NaN NaN NaN NaN NaN NaN NaN NaN 0.7981 12 0.8355 NaN NaN NaN NaN NaN NaN NaN NaN 0.2950 13 1.5157 NaN NaN NaN NaN NaN NaN NaN NaN 0.7630 14 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 15 0.3561 NaN NaN NaN NaN NaN NaN NaN NaN 0.1983 16 16.9953 NaN NaN NaN NaN NaN NaN NaN NaN 11.6154 17 NaN 2.5533 1.7676 4.8479 2.1782 2.0693 NaN NaN NaN NaN 18 NaN 4.8740 4.5862 5.6155 5.3850 5.1158 NaN NaN NaN NaN 19 NaN 5.5761 7.1540 5.2305 7.0061 6.6558 NaN NaN NaN NaN 20 NaN 5.6369 8.0997 5.0377 7.4323 7.0607 NaN NaN NaN NaN 21 NaN 5.6762 8.5204 5.0503 7.9827 7.5835 NaN NaN NaN NaN 22 NaN 5.7317 8.9214 4.7230 8.4647 8.0415 NaN NaN NaN NaN 23 NaN 5.6349 8.3186 4.2832 8.4023 7.9822 NaN NaN NaN NaN 24 NaN 5.5504 9.1297 4.2451 8.2951 7.8803 NaN NaN NaN NaN 25 NaN 5.9629 9.0821 4.3384 9.0512 8.5986 NaN NaN NaN NaN 26 NaN 5.7665 10.1691 4.2266 8.9481 8.5007 NaN NaN NaN NaN 27 NaN 5.6709 9.1637 4.0334 9.0945 8.6397 NaN NaN NaN NaN 28 NaN 5.8178 8.8859 4.0104 9.0523 8.5997 NaN NaN NaN NaN 29 NaN 5.5470 9.0448 3.9718 8.8667 8.4233 NaN NaN NaN NaN [...] Actual size is 66x10 I have sequence of about 17 non NAN values for each column. I would like to drop the Nan cells to have a a full 17x10 table. I used pd.DataFrame.dropna but it doesn't remove patches of cell. Is there a way to do so without looping over columns?
I think you can use apply with dropna: df = df.apply(lambda x: pd.Series(x.dropna().values)) print (df) Another numpy solution with sorting numpy array created by values and then remove rows with all NaN by dropna: df = pd.DataFrame(np.sort(df.values, axis=0), index=df.index, columns=df.columns) .dropna(how='all') print (df)