Если вы уже используете jQuery UI в своем проекте, вы можете сделать это следующим образом:
var formatted = $.datepicker.formatDate("M d, yy", new Date("2014-07-08T09:02:21.377"));
// formatted will be 'Jul 8, 2014'
Доступны некоторые параметры формата даты датпикера для игры здесь .
Вот что я сделал:
Я расколол ваш файл данных в более длинный формат, а затем сгруппировал его по столбцу имен. В каждой группе я бросаю NaNs, но затем пересказываю полный набор h1 мысли h4, тем самым воссоздавая ваши NaN справа.
from io import StringIO
import pandas
def defragment(x):
values = x.dropna().values
return pandas.Series(values, index=df.columns[:len(values)])
datastring = StringIO("""\
Name h1 h2 h3 h4
A 1 nan 2 3
B nan nan 1 3
C 1 3 2 nan""")
df = pandas.read_table(datastring, sep='\s+').set_index('Name')
long_index = pandas.MultiIndex.from_product([df.index, df.columns])
print(
df.stack()
.groupby(level='Name')
.apply(defragment)
.reindex(long_index)
.unstack()
)
И вот я получаю:
h1 h2 h3 h4
A 1 2 3 NaN
B 1 3 NaN NaN
C 1 3 2 NaN
Вот как вы могли бы сделать это с помощью регулярного выражения (возможно, не рекомендуется):
pd.read_csv(StringIO(re.sub(',+',',',df.to_csv())))
Out[20]:
Name h1 h2 h3 h4
0 A 1 2 3 NaN
1 B 1 3 NaN NaN
2 C 1 3 2 NaN
Сначала сделайте функцию.
def squeeze_nan(x):
original_columns = x.index.tolist()
squeezed = x.dropna()
squeezed.index = [original_columns[n] for n in range(squeezed.count())]
return squeezed.reindex(original_columns, fill_value=np.nan)
Во-вторых, примените функцию.
df.apply(squeeze_nan, axis=1)
Вы также можете попробовать оси = 0 и. [:: - 1]
[EDIT]
@ Mxracer888 вы хотите это?
def squeeze_nan(x, hold):
if x.name not in hold:
original_columns = x.index.tolist()
squeezed = x.dropna()
squeezed.index = [original_columns[n] for n in range(squeezed.count())]
return squeezed.reindex(original_columns, fill_value=np.nan)
else:
return x
df.apply(lambda x: squeeze_nan(x, ['B']), axis=1)